@sonordev/site-kit 5.4.0 → 5.6.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 (381) hide show
  1. package/AGENTS.md +16 -6
  2. package/README.md +9 -7
  3. package/agent-manifest.json +7 -7
  4. package/dist/AnalyticsProvider-6PXC7UDP.js +32 -0
  5. package/dist/{AnalyticsProvider-Y2P2BPOI.js.map → AnalyticsProvider-6PXC7UDP.js.map} +1 -1
  6. package/dist/AnalyticsProvider-FVQIYSLY.mjs +11 -0
  7. package/dist/{AnalyticsProvider-2XIOMRCN.mjs.map → AnalyticsProvider-FVQIYSLY.mjs.map} +1 -1
  8. package/dist/{BlogViewTracker-6EGEDPP3.js → BlogViewTracker-S4HSRCW7.js} +6 -6
  9. package/dist/{BlogViewTracker-6EGEDPP3.js.map → BlogViewTracker-S4HSRCW7.js.map} +1 -1
  10. package/dist/{BlogViewTracker-R4YQ76WP.mjs → BlogViewTracker-ZUGLBOVI.mjs} +5 -5
  11. package/dist/{BlogViewTracker-R4YQ76WP.mjs.map → BlogViewTracker-ZUGLBOVI.mjs.map} +1 -1
  12. package/dist/ChatWidget-2TQWCXWP.js +22 -0
  13. package/dist/{ChatWidget-2OFWPCWF.js.map → ChatWidget-2TQWCXWP.js.map} +1 -1
  14. package/dist/ChatWidget-DG52ZIE6.mjs +13 -0
  15. package/dist/{ChatWidget-4AOGHYXQ.mjs.map → ChatWidget-DG52ZIE6.mjs.map} +1 -1
  16. package/dist/EngageWidget-2VUJADIU.mjs +12 -0
  17. package/dist/{EngageWidget-SFO2XRNG.mjs.map → EngageWidget-2VUJADIU.mjs.map} +1 -1
  18. package/dist/EngageWidget-Z7RC2INM.js +21 -0
  19. package/dist/{EngageWidget-T4KAAD3G.js.map → EngageWidget-Z7RC2INM.js.map} +1 -1
  20. package/dist/{FileField-7DF2SLPF.mjs → FileField-FSQ7W3A5.mjs} +5 -5
  21. package/dist/{FileField-7DF2SLPF.mjs.map → FileField-FSQ7W3A5.mjs.map} +1 -1
  22. package/dist/{FileField-CE2XNBBG.js → FileField-UOQHL25J.js} +6 -6
  23. package/dist/{FileField-CE2XNBBG.js.map → FileField-UOQHL25J.js.map} +1 -1
  24. package/dist/{FormSpotlight-IRLKSZGV.mjs → FormSpotlight-RHL5FWM2.mjs} +3 -3
  25. package/dist/{FormSpotlight-IRLKSZGV.mjs.map → FormSpotlight-RHL5FWM2.mjs.map} +1 -1
  26. package/dist/{FormSpotlight-ZD3WR5BC.js → FormSpotlight-TED32NHP.js} +15 -15
  27. package/dist/{FormSpotlight-ZD3WR5BC.js.map → FormSpotlight-TED32NHP.js.map} +1 -1
  28. package/dist/{FormStage-2OSRNQJL.mjs → FormStage-DINIRFOX.mjs} +3 -3
  29. package/dist/{FormStage-2OSRNQJL.mjs.map → FormStage-DINIRFOX.mjs.map} +1 -1
  30. package/dist/{FormStage-OSPXOUQE.js → FormStage-PFEBKHGY.js} +13 -13
  31. package/dist/{FormStage-OSPXOUQE.js.map → FormStage-PFEBKHGY.js.map} +1 -1
  32. package/dist/ManagedForm-43WLCUAK.js +23 -0
  33. package/dist/{ManagedForm-JCHGBBQW.js.map → ManagedForm-43WLCUAK.js.map} +1 -1
  34. package/dist/ManagedForm-545YAUFC.mjs +14 -0
  35. package/dist/{ManagedForm-5G37EDJT.mjs.map → ManagedForm-545YAUFC.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-4LVJZROZ.js → ManagedNewsletterForm-I3QN57HB.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-4LVJZROZ.js.map → ManagedNewsletterForm-I3QN57HB.js.map} +1 -1
  38. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs → ManagedNewsletterForm-ZPY5RRKX.mjs} +7 -7
  39. package/dist/{ManagedNewsletterForm-QJSVH23S.mjs.map → ManagedNewsletterForm-ZPY5RRKX.mjs.map} +1 -1
  40. package/dist/{SignalCore-L6Z3YTCF.mjs → SignalCore-EEH5IM4U.mjs} +5 -5
  41. package/dist/{SignalCore-L6Z3YTCF.mjs.map → SignalCore-EEH5IM4U.mjs.map} +1 -1
  42. package/dist/{SignalCore-NQ4YEOI7.js → SignalCore-M4AXIMV4.js} +11 -11
  43. package/dist/{SignalCore-NQ4YEOI7.js.map → SignalCore-M4AXIMV4.js.map} +1 -1
  44. package/dist/SitemapSync-46G7LVZS.mjs +9 -0
  45. package/dist/{SitemapSync-MYSTLJOM.mjs.map → SitemapSync-46G7LVZS.mjs.map} +1 -1
  46. package/dist/SitemapSync-XK4JKCS7.js +18 -0
  47. package/dist/{SitemapSync-3LUZWBTB.js.map → SitemapSync-XK4JKCS7.js.map} +1 -1
  48. package/dist/SitemapSync.d.ts +3 -2
  49. package/dist/SitemapSync.d.ts.map +1 -1
  50. package/dist/analytics/AnalyticsProvider.d.ts +3 -1
  51. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  52. package/dist/analytics/WebVitals.d.ts +3 -1
  53. package/dist/analytics/WebVitals.d.ts.map +1 -1
  54. package/dist/analytics/dispatch.d.ts +4 -4
  55. package/dist/analytics/index.js +19 -19
  56. package/dist/analytics/index.mjs +7 -7
  57. package/dist/analytics/send-gate.d.ts +8 -37
  58. package/dist/analytics/send-gate.d.ts.map +1 -1
  59. package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
  60. package/dist/api-D745LGGU.mjs.map +1 -0
  61. package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
  62. package/dist/api-XR5APCH3.js.map +1 -0
  63. package/dist/blog/index.js +20 -20
  64. package/dist/blog/index.mjs +3 -3
  65. package/dist/blog/server-ui.js +14 -14
  66. package/dist/blog/server-ui.mjs +2 -2
  67. package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
  68. package/dist/chunk-3DWIYCQX.js.map +1 -0
  69. package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
  70. package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
  71. package/dist/{chunk-LIYSLNEK.mjs → chunk-473WDGQZ.mjs} +3 -3
  72. package/dist/{chunk-LIYSLNEK.mjs.map → chunk-473WDGQZ.mjs.map} +1 -1
  73. package/dist/chunk-4U5NCKQY.mjs +39 -0
  74. package/dist/chunk-4U5NCKQY.mjs.map +1 -0
  75. package/dist/{chunk-ITFZZ6YT.js → chunk-53KMRZT7.js} +3 -3
  76. package/dist/{chunk-ITFZZ6YT.js.map → chunk-53KMRZT7.js.map} +1 -1
  77. package/dist/{chunk-N6AVWMIB.mjs → chunk-5KIEZHVK.mjs} +19 -18
  78. package/dist/chunk-5KIEZHVK.mjs.map +1 -0
  79. package/dist/{chunk-ZLPXFV5Y.js → chunk-5KIO6FXE.js} +5 -5
  80. package/dist/{chunk-ZLPXFV5Y.js.map → chunk-5KIO6FXE.js.map} +1 -1
  81. package/dist/chunk-5RNAUYWE.js +50 -0
  82. package/dist/chunk-5RNAUYWE.js.map +1 -0
  83. package/dist/{chunk-ACTLQ2RH.mjs → chunk-5UFDHGFE.mjs} +4 -4
  84. package/dist/chunk-5UFDHGFE.mjs.map +1 -0
  85. package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
  86. package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.mjs.map} +1 -1
  87. package/dist/{chunk-G5I3XEQS.mjs → chunk-6OP5XSMM.mjs} +3 -3
  88. package/dist/{chunk-G5I3XEQS.mjs.map → chunk-6OP5XSMM.mjs.map} +1 -1
  89. package/dist/{chunk-7Y2UPFSY.mjs → chunk-7AUDKXY5.mjs} +3 -3
  90. package/dist/{chunk-7Y2UPFSY.mjs.map → chunk-7AUDKXY5.mjs.map} +1 -1
  91. package/dist/{chunk-A2VLEORI.mjs → chunk-7C7XO5HX.mjs} +3 -3
  92. package/dist/{chunk-A2VLEORI.mjs.map → chunk-7C7XO5HX.mjs.map} +1 -1
  93. package/dist/chunk-A6UYV475.mjs +45 -0
  94. package/dist/chunk-A6UYV475.mjs.map +1 -0
  95. package/dist/{chunk-SZHKNGNR.mjs → chunk-AEARU24Q.mjs} +40 -26
  96. package/dist/chunk-AEARU24Q.mjs.map +1 -0
  97. package/dist/{chunk-ZDFVYSKK.mjs → chunk-AHZR4VGY.mjs} +5 -5
  98. package/dist/{chunk-ZDFVYSKK.mjs.map → chunk-AHZR4VGY.mjs.map} +1 -1
  99. package/dist/{chunk-4WQB2ORG.js → chunk-AY7JBGYC.js} +15 -15
  100. package/dist/chunk-AY7JBGYC.js.map +1 -0
  101. package/dist/{chunk-5737U6DI.js → chunk-B64AZC6P.js} +15 -15
  102. package/dist/{chunk-5737U6DI.js.map → chunk-B64AZC6P.js.map} +1 -1
  103. package/dist/{chunk-ZY5AVC4P.js → chunk-B6O7D5U4.js} +55 -49
  104. package/dist/chunk-B6O7D5U4.js.map +1 -0
  105. package/dist/{chunk-LHYVFWHL.js → chunk-BWSMUSDB.js} +8 -8
  106. package/dist/{chunk-LHYVFWHL.js.map → chunk-BWSMUSDB.js.map} +1 -1
  107. package/dist/{chunk-WSUQ76LN.js → chunk-BZLIOT7Q.js} +18 -18
  108. package/dist/{chunk-WSUQ76LN.js.map → chunk-BZLIOT7Q.js.map} +1 -1
  109. package/dist/{chunk-HH5KGXTK.mjs → chunk-C2MSD2UM.mjs} +4 -4
  110. package/dist/{chunk-HH5KGXTK.mjs.map → chunk-C2MSD2UM.mjs.map} +1 -1
  111. package/dist/{chunk-DPDV5Z4G.js → chunk-CQRLKNHQ.js} +12 -12
  112. package/dist/{chunk-DPDV5Z4G.js.map → chunk-CQRLKNHQ.js.map} +1 -1
  113. package/dist/{chunk-SJXGIUHP.mjs → chunk-CQS5ZYI6.mjs} +22 -9
  114. package/dist/chunk-CQS5ZYI6.mjs.map +1 -0
  115. package/dist/{chunk-LUYUFILE.js → chunk-DHIWR7CG.js} +4 -4
  116. package/dist/{chunk-LUYUFILE.js.map → chunk-DHIWR7CG.js.map} +1 -1
  117. package/dist/chunk-DQUBETXH.mjs +6 -0
  118. package/dist/{chunk-7U7C6XRI.mjs.map → chunk-DQUBETXH.mjs.map} +1 -1
  119. package/dist/chunk-ESP5RMB7.js +42 -0
  120. package/dist/chunk-ESP5RMB7.js.map +1 -0
  121. package/dist/chunk-G6WF4G3E.js +43 -0
  122. package/dist/chunk-G6WF4G3E.js.map +1 -0
  123. package/dist/{chunk-XWF7QPIP.mjs → chunk-GJ6NOLGC.mjs} +3 -3
  124. package/dist/{chunk-XWF7QPIP.mjs.map → chunk-GJ6NOLGC.mjs.map} +1 -1
  125. package/dist/{chunk-MTANHZKJ.mjs → chunk-GPLCPMVD.mjs} +7 -7
  126. package/dist/{chunk-MTANHZKJ.mjs.map → chunk-GPLCPMVD.mjs.map} +1 -1
  127. package/dist/{chunk-QWLL3B6U.js → chunk-H3D3ZGOJ.js} +26 -23
  128. package/dist/chunk-H3D3ZGOJ.js.map +1 -0
  129. package/dist/{chunk-NUH245XK.mjs → chunk-H44XZUOV.mjs} +16 -13
  130. package/dist/chunk-H44XZUOV.mjs.map +1 -0
  131. package/dist/{chunk-MIFP6QEQ.mjs → chunk-HIHAXEPD.mjs} +4 -4
  132. package/dist/{chunk-MIFP6QEQ.mjs.map → chunk-HIHAXEPD.mjs.map} +1 -1
  133. package/dist/{chunk-UOLY4NXK.mjs → chunk-IYCLN3XS.mjs} +15 -34
  134. package/dist/chunk-IYCLN3XS.mjs.map +1 -0
  135. package/dist/{chunk-HBMF3M5F.js → chunk-JE5DWAE6.js} +4 -4
  136. package/dist/{chunk-HBMF3M5F.js.map → chunk-JE5DWAE6.js.map} +1 -1
  137. package/dist/{chunk-KQ3VAOAF.mjs → chunk-JNABXCLY.mjs} +4 -4
  138. package/dist/{chunk-KQ3VAOAF.mjs.map → chunk-JNABXCLY.mjs.map} +1 -1
  139. package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
  140. package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
  141. package/dist/{chunk-I4PDSDVE.mjs → chunk-K2V3ZW36.mjs} +3 -3
  142. package/dist/{chunk-I4PDSDVE.mjs.map → chunk-K2V3ZW36.mjs.map} +1 -1
  143. package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
  144. package/dist/chunk-KPKQKFT4.js.map +1 -0
  145. package/dist/chunk-KSL3WA2I.js +8 -0
  146. package/dist/{chunk-UTOHMK52.js.map → chunk-KSL3WA2I.js.map} +1 -1
  147. package/dist/{chunk-VWDT7H6L.js → chunk-KY6M76JW.js} +3 -3
  148. package/dist/{chunk-VWDT7H6L.js.map → chunk-KY6M76JW.js.map} +1 -1
  149. package/dist/{chunk-EBMPXFOP.mjs → chunk-LCSYJXIO.mjs} +3 -3
  150. package/dist/{chunk-EBMPXFOP.mjs.map → chunk-LCSYJXIO.mjs.map} +1 -1
  151. package/dist/{chunk-AWFZIXCT.js → chunk-N2PGTPWN.js} +25 -12
  152. package/dist/chunk-N2PGTPWN.js.map +1 -0
  153. package/dist/chunk-NSWO43XW.mjs +39 -0
  154. package/dist/chunk-NSWO43XW.mjs.map +1 -0
  155. package/dist/{chunk-KMGGAL2X.js → chunk-NZSFOZJV.js} +40 -26
  156. package/dist/chunk-NZSFOZJV.js.map +1 -0
  157. package/dist/{chunk-JJ26JKBJ.mjs → chunk-OA7KKOAK.mjs} +25 -31
  158. package/dist/chunk-OA7KKOAK.mjs.map +1 -0
  159. package/dist/{chunk-GQ6CUOLA.js → chunk-OC7AO7XS.js} +15 -15
  160. package/dist/{chunk-GQ6CUOLA.js.map → chunk-OC7AO7XS.js.map} +1 -1
  161. package/dist/{chunk-HDDV63XJ.mjs → chunk-QNPVVWR7.mjs} +3 -3
  162. package/dist/{chunk-HDDV63XJ.mjs.map → chunk-QNPVVWR7.mjs.map} +1 -1
  163. package/dist/{chunk-URVGBWCP.js → chunk-R3KTBKSW.js} +4 -4
  164. package/dist/{chunk-URVGBWCP.js.map → chunk-R3KTBKSW.js.map} +1 -1
  165. package/dist/{chunk-6CUBSQMD.mjs → chunk-RIYAMYLV.mjs} +3 -3
  166. package/dist/{chunk-6CUBSQMD.mjs.map → chunk-RIYAMYLV.mjs.map} +1 -1
  167. package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
  168. package/dist/chunk-RU54J2PY.mjs.map +1 -0
  169. package/dist/{chunk-7IPSQ5JR.js → chunk-S4RC6VAQ.js} +21 -20
  170. package/dist/chunk-S4RC6VAQ.js.map +1 -0
  171. package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
  172. package/dist/chunk-SHLWA6JY.mjs.map +1 -0
  173. package/dist/{chunk-OXZYP32B.js → chunk-SYGGZZMU.js} +21 -17
  174. package/dist/chunk-SYGGZZMU.js.map +1 -0
  175. package/dist/{chunk-LF4L3ZP5.js → chunk-T5VTQUNF.js} +8 -8
  176. package/dist/{chunk-LF4L3ZP5.js.map → chunk-T5VTQUNF.js.map} +1 -1
  177. package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
  178. package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
  179. package/dist/{chunk-N6X76QUF.mjs → chunk-USKIL6V6.mjs} +3 -3
  180. package/dist/{chunk-N6X76QUF.mjs.map → chunk-USKIL6V6.mjs.map} +1 -1
  181. package/dist/{chunk-2KIGFOPM.js → chunk-UU47DGHE.js} +25 -44
  182. package/dist/chunk-UU47DGHE.js.map +1 -0
  183. package/dist/{chunk-B36PTS7B.mjs → chunk-VHZ4LHQT.mjs} +48 -42
  184. package/dist/chunk-VHZ4LHQT.mjs.map +1 -0
  185. package/dist/{chunk-7PLH3H3W.js → chunk-X5TCH7VZ.js} +3 -3
  186. package/dist/{chunk-7PLH3H3W.js.map → chunk-X5TCH7VZ.js.map} +1 -1
  187. package/dist/{chunk-LBS4PRC7.js → chunk-XK5AIWQG.js} +3 -3
  188. package/dist/{chunk-LBS4PRC7.js.map → chunk-XK5AIWQG.js.map} +1 -1
  189. package/dist/{chunk-U53KN4SA.js → chunk-XR32C47O.js} +26 -32
  190. package/dist/chunk-XR32C47O.js.map +1 -0
  191. package/dist/{chunk-DQM5GR2P.mjs → chunk-YCI36ZUS.mjs} +18 -14
  192. package/dist/chunk-YCI36ZUS.mjs.map +1 -0
  193. package/dist/{chunk-VA36CJRV.js → chunk-YYN4YZYZ.js} +4 -4
  194. package/dist/{chunk-VA36CJRV.js.map → chunk-YYN4YZYZ.js.map} +1 -1
  195. package/dist/cli/agent/checks.d.ts.map +1 -1
  196. package/dist/cli/agent/ssr-bailout.d.ts +27 -0
  197. package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
  198. package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
  199. package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
  200. package/dist/cli/api/{uptrade.d.ts → sonor.d.ts} +3 -2
  201. package/dist/cli/api/sonor.d.ts.map +1 -0
  202. package/dist/cli/codemod/transforms.d.ts.map +1 -1
  203. package/dist/cli/commands/config-regression.test.d.ts +2 -0
  204. package/dist/cli/commands/config-regression.test.d.ts.map +1 -0
  205. package/dist/cli/commands/faqs.d.ts.map +1 -1
  206. package/dist/cli/commands/images.d.ts.map +1 -1
  207. package/dist/cli/commands/locations.d.ts.map +1 -1
  208. package/dist/cli/commands/migrate.d.ts.map +1 -1
  209. package/dist/cli/commands/setup.d.ts.map +1 -1
  210. package/dist/cli/config.d.ts +31 -0
  211. package/dist/cli/config.d.ts.map +1 -0
  212. package/dist/cli/config.test.d.ts +2 -0
  213. package/dist/cli/config.test.d.ts.map +1 -0
  214. package/dist/cli/index.js +494 -518
  215. package/dist/cli/index.js.map +1 -1
  216. package/dist/cli/index.mjs +487 -511
  217. package/dist/cli/index.mjs.map +1 -1
  218. package/dist/cli/migrator/index.d.ts +1 -0
  219. package/dist/cli/migrator/index.d.ts.map +1 -1
  220. package/dist/cli/state.d.ts +7 -0
  221. package/dist/cli/state.d.ts.map +1 -0
  222. package/dist/cli/state.test.d.ts +2 -0
  223. package/dist/cli/state.test.d.ts.map +1 -0
  224. package/dist/client/index.d.ts +1 -0
  225. package/dist/client/index.d.ts.map +1 -1
  226. package/dist/client/index.js +20 -7
  227. package/dist/client/index.js.map +1 -1
  228. package/dist/client/index.mjs +5 -4
  229. package/dist/client/index.mjs.map +1 -1
  230. package/dist/cms/index.js.map +1 -1
  231. package/dist/cms/index.mjs.map +1 -1
  232. package/dist/cms/sanity-image.d.ts +1 -1
  233. package/dist/commerce/index.js +59 -59
  234. package/dist/commerce/index.mjs +8 -8
  235. package/dist/engage/ChatWidget.d.ts.map +1 -1
  236. package/dist/engage/EngageWidget.d.ts +4 -4
  237. package/dist/engage/EngageWidget.d.ts.map +1 -1
  238. package/dist/engage/chat-launcher.test.d.ts +2 -0
  239. package/dist/engage/chat-launcher.test.d.ts.map +1 -0
  240. package/dist/engage/index.js +13 -10
  241. package/dist/engage/index.js.map +1 -1
  242. package/dist/engage/index.mjs +10 -7
  243. package/dist/engage/index.mjs.map +1 -1
  244. package/dist/engage/launcher-placement.d.ts +56 -0
  245. package/dist/engage/launcher-placement.d.ts.map +1 -0
  246. package/dist/engage/launcher-placement.test.d.ts +2 -0
  247. package/dist/engage/launcher-placement.test.d.ts.map +1 -0
  248. package/dist/engage/types.d.ts +41 -7
  249. package/dist/engage/types.d.ts.map +1 -1
  250. package/dist/fleet/FleetHeartbeat.d.ts +3 -2
  251. package/dist/fleet/FleetHeartbeat.d.ts.map +1 -1
  252. package/dist/fleet/heartbeat.d.ts +3 -2
  253. package/dist/fleet/heartbeat.d.ts.map +1 -1
  254. package/dist/fleet/heartbeat.test.d.ts +2 -0
  255. package/dist/fleet/heartbeat.test.d.ts.map +1 -0
  256. package/dist/fleet/index.js +9 -8
  257. package/dist/fleet/index.mjs +5 -4
  258. package/dist/forms/index.js +16 -16
  259. package/dist/forms/index.mjs +9 -9
  260. package/dist/forms/server.js +10 -10
  261. package/dist/forms/server.mjs +8 -8
  262. package/dist/forms/static.js +7 -7
  263. package/dist/forms/static.mjs +6 -6
  264. package/dist/images/ManagedImage.d.ts.map +1 -1
  265. package/dist/images/index.js +11 -11
  266. package/dist/images/index.mjs +4 -4
  267. package/dist/index.js +66 -66
  268. package/dist/index.mjs +12 -12
  269. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  270. package/dist/layout/client.d.ts.map +1 -1
  271. package/dist/layout/client.js +9 -8
  272. package/dist/layout/client.mjs +8 -7
  273. package/dist/layout/index.js +11 -10
  274. package/dist/layout/index.js.map +1 -1
  275. package/dist/layout/index.mjs +9 -8
  276. package/dist/layout/index.mjs.map +1 -1
  277. package/dist/layout/types.d.ts +9 -3
  278. package/dist/layout/types.d.ts.map +1 -1
  279. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  280. package/dist/llms/index.js +12 -12
  281. package/dist/llms/index.mjs +2 -2
  282. package/dist/llms/types.d.ts +7 -1
  283. package/dist/llms/types.d.ts.map +1 -1
  284. package/dist/maps/index.js +5 -5
  285. package/dist/maps/index.mjs +3 -3
  286. package/dist/mcp/WebMcpTools.d.ts +5 -2
  287. package/dist/mcp/WebMcpTools.d.ts.map +1 -1
  288. package/dist/mcp/client.js.map +1 -1
  289. package/dist/mcp/client.mjs.map +1 -1
  290. package/dist/search/index.js +4 -4
  291. package/dist/search/index.mjs +3 -3
  292. package/dist/seo/LocationPageContent.d.ts +6 -5
  293. package/dist/seo/LocationPageContent.d.ts.map +1 -1
  294. package/dist/seo/api.d.ts +4 -5
  295. package/dist/seo/api.d.ts.map +1 -1
  296. package/dist/seo/client.js +6 -6
  297. package/dist/seo/client.mjs +5 -5
  298. package/dist/seo/index.js +43 -43
  299. package/dist/seo/index.js.map +1 -1
  300. package/dist/seo/index.mjs +9 -9
  301. package/dist/seo/index.mjs.map +1 -1
  302. package/dist/seo/routing.d.ts +9 -23
  303. package/dist/seo/routing.d.ts.map +1 -1
  304. package/dist/seo/server-api.d.ts +11 -5
  305. package/dist/seo/server-api.d.ts.map +1 -1
  306. package/dist/seo/server.js +18 -18
  307. package/dist/seo/server.mjs +2 -2
  308. package/dist/server/index.js +3 -3
  309. package/dist/server/index.mjs +2 -2
  310. package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
  311. package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
  312. package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
  313. package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
  314. package/dist/shared/reporting-gate.d.ts +43 -0
  315. package/dist/shared/reporting-gate.d.ts.map +1 -0
  316. package/dist/shared/version.d.ts +1 -1
  317. package/dist/shared/visual-viewport-gap.d.ts +52 -0
  318. package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
  319. package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
  320. package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
  321. package/dist/signal/index.js +11 -11
  322. package/dist/signal/index.mjs +2 -2
  323. package/dist/sitemap/index.js +2 -2
  324. package/dist/sitemap/index.mjs +1 -1
  325. package/dist/sync/AddToCalendar.d.ts +19 -0
  326. package/dist/sync/AddToCalendar.d.ts.map +1 -0
  327. package/dist/sync/BookingWidget.d.ts.map +1 -1
  328. package/dist/sync/add-to-calendar.test.d.ts +2 -0
  329. package/dist/sync/add-to-calendar.test.d.ts.map +1 -0
  330. package/dist/sync/api-errors.test.d.ts +2 -0
  331. package/dist/sync/api-errors.test.d.ts.map +1 -0
  332. package/dist/sync/api.d.ts.map +1 -1
  333. package/dist/sync/index.js +17 -17
  334. package/dist/sync/index.mjs +4 -4
  335. package/dist/sync/types.d.ts +14 -0
  336. package/dist/sync/types.d.ts.map +1 -1
  337. package/dist/types.d.ts +9 -0
  338. package/dist/types.d.ts.map +1 -1
  339. package/package.json +4 -4
  340. package/skills/site-kit/SKILL.md +8 -3
  341. package/dist/AnalyticsProvider-2XIOMRCN.mjs +0 -11
  342. package/dist/AnalyticsProvider-Y2P2BPOI.js +0 -32
  343. package/dist/ChatWidget-2OFWPCWF.js +0 -20
  344. package/dist/ChatWidget-4AOGHYXQ.mjs +0 -11
  345. package/dist/EngageWidget-SFO2XRNG.mjs +0 -9
  346. package/dist/EngageWidget-T4KAAD3G.js +0 -18
  347. package/dist/ManagedForm-5G37EDJT.mjs +0 -14
  348. package/dist/ManagedForm-JCHGBBQW.js +0 -23
  349. package/dist/SitemapSync-3LUZWBTB.js +0 -18
  350. package/dist/SitemapSync-MYSTLJOM.mjs +0 -9
  351. package/dist/api-N5OLQXYN.js.map +0 -1
  352. package/dist/api-NTHZ6PAW.mjs.map +0 -1
  353. package/dist/chunk-2KIGFOPM.js.map +0 -1
  354. package/dist/chunk-3DPXOZAU.mjs.map +0 -1
  355. package/dist/chunk-4WQB2ORG.js.map +0 -1
  356. package/dist/chunk-7IPSQ5JR.js.map +0 -1
  357. package/dist/chunk-7U7C6XRI.mjs +0 -6
  358. package/dist/chunk-ACTLQ2RH.mjs.map +0 -1
  359. package/dist/chunk-AWFZIXCT.js.map +0 -1
  360. package/dist/chunk-B36PTS7B.mjs.map +0 -1
  361. package/dist/chunk-B4BFQSSS.mjs.map +0 -1
  362. package/dist/chunk-DQM5GR2P.mjs.map +0 -1
  363. package/dist/chunk-HMFFAUCD.js.map +0 -1
  364. package/dist/chunk-JJ26JKBJ.mjs.map +0 -1
  365. package/dist/chunk-KMGGAL2X.js.map +0 -1
  366. package/dist/chunk-L2LJQIM3.js.map +0 -1
  367. package/dist/chunk-N6AVWMIB.mjs.map +0 -1
  368. package/dist/chunk-NUH245XK.mjs.map +0 -1
  369. package/dist/chunk-NVSWTDWU.mjs +0 -25
  370. package/dist/chunk-NVSWTDWU.mjs.map +0 -1
  371. package/dist/chunk-OL2QBWAU.js +0 -29
  372. package/dist/chunk-OL2QBWAU.js.map +0 -1
  373. package/dist/chunk-OXZYP32B.js.map +0 -1
  374. package/dist/chunk-QWLL3B6U.js.map +0 -1
  375. package/dist/chunk-SJXGIUHP.mjs.map +0 -1
  376. package/dist/chunk-SZHKNGNR.mjs.map +0 -1
  377. package/dist/chunk-U53KN4SA.js.map +0 -1
  378. package/dist/chunk-UOLY4NXK.mjs.map +0 -1
  379. package/dist/chunk-UTOHMK52.js +0 -8
  380. package/dist/chunk-ZY5AVC4P.js.map +0 -1
  381. package/dist/cli/api/uptrade.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/layout/SpeculationRules.tsx","../../src/layout/SiteKitLayout.tsx"],"names":["jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * SpeculationRules — declarative near-instant navigation for static sites.\n *\n * Emits a `<script type=\"speculationrules\">` telling supporting browsers\n * (Chromium 121+) to prerender same-origin links as the user shows intent\n * (moderate eagerness = hover/mousedown). Non-supporting browsers ignore the\n * tag entirely; there is no JS, no polyfill, no runtime cost — pure\n * progressive enhancement, ideal for the force-static fleet.\n *\n * Server component: renders during SSR, ships as static HTML.\n *\n * Excluded by default: URLs with a query string (often personalized) and\n * obvious non-page paths. Keep exclusions tight — prerendering a page that\n * sets cookies or fires analytics on load double-fires them only if the\n * analytics module ignores prerendering; site-kit analytics defers to\n * post-activation, and Chrome delays most side effects until activation.\n */\n\ninterface SpeculationRulesProps {\n /**\n * 'prerender' (default) renders the next page fully in the background;\n * 'prefetch' only fetches the document. Prefetch is the conservative\n * fallback if a site sees issues with prerender.\n */\n mode?: 'prerender' | 'prefetch'\n /** Additional URL patterns to exclude (speculation rules URL pattern syntax). */\n exclude?: string[]\n}\n\nexport function SpeculationRules({ mode = 'prerender', exclude = [] }: SpeculationRulesProps) {\n const rules = {\n [mode]: [\n {\n source: 'document' as const,\n where: {\n and: [\n { href_matches: '/*' },\n { not: { href_matches: '/*\\\\?*' } },\n { not: { href_matches: '/api/*' } },\n ...exclude.map(pattern => ({ not: { href_matches: pattern } })),\n ],\n },\n eagerness: 'moderate' as const,\n },\n ],\n }\n\n return (\n <script\n type=\"speculationrules\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(rules) }}\n />\n )\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 { SpeculationRules } from './SpeculationRules'\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 /**\n * Runtime SitemapSync from the visitor's browser. **Default: false.**\n *\n * Sitemap registration is a build-time and server-side job. Build-time\n * `createSitemap` is canonical, and sonor-api's nightly reconciler fetches\n * each host's /sitemap.xml itself, so nothing here needs a visitor.\n *\n * This defaulted to true, and because its throttle lives in sessionStorage\n * and its content hash in localStorage, every first-time visitor, incognito\n * tab and crawler missed both guards and re-POSTed the entire sitemap:\n * upforge.io took ~140 full syncs in a day, queencityriverboats.com ~76.\n * That coupled sitemap traffic to VISITOR COUNT rather than to content\n * changes — exactly backwards — and made every reader pay for platform\n * bookkeeping in bandwidth, XML parsing and an API round-trip.\n *\n * Set true only to re-enable the legacy browser fallback for a site whose\n * build-time registration cannot be made to work.\n */\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 * Emit a Speculation Rules script prerendering same-origin links on intent\n * (Chromium 121+; other browsers ignore it). Zero JS, static-safe. Default\n * false — opt in per site, or pass { mode: 'prefetch' } for the\n * conservative variant.\n */\n speculation?: boolean | { mode?: 'prerender' | 'prefetch'; exclude?: string[] }\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 = false,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n speculation = 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 {speculation && (\n <SpeculationRules {...(typeof speculation === 'object' ? speculation : {})} />\n )}\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 mapsBrowserKey={\n process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ||\n process.env.GOOGLE_MAPS_BROWSER_KEY ||\n undefined\n }\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/SpeculationRules.tsx","../../src/layout/SiteKitLayout.tsx"],"names":["jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * SpeculationRules — declarative near-instant navigation for static sites.\n *\n * Emits a `<script type=\"speculationrules\">` telling supporting browsers\n * (Chromium 121+) to prerender same-origin links as the user shows intent\n * (moderate eagerness = hover/mousedown). Non-supporting browsers ignore the\n * tag entirely; there is no JS, no polyfill, no runtime cost — pure\n * progressive enhancement, ideal for the force-static fleet.\n *\n * Server component: renders during SSR, ships as static HTML.\n *\n * Excluded by default: URLs with a query string (often personalized) and\n * obvious non-page paths. Keep exclusions tight — prerendering a page that\n * sets cookies or fires analytics on load double-fires them only if the\n * analytics module ignores prerendering; site-kit analytics defers to\n * post-activation, and Chrome delays most side effects until activation.\n */\n\ninterface SpeculationRulesProps {\n /**\n * 'prerender' (default) renders the next page fully in the background;\n * 'prefetch' only fetches the document. Prefetch is the conservative\n * fallback if a site sees issues with prerender.\n */\n mode?: 'prerender' | 'prefetch'\n /** Additional URL patterns to exclude (speculation rules URL pattern syntax). */\n exclude?: string[]\n}\n\nexport function SpeculationRules({ mode = 'prerender', exclude = [] }: SpeculationRulesProps) {\n const rules = {\n [mode]: [\n {\n source: 'document' as const,\n where: {\n and: [\n { href_matches: '/*' },\n { not: { href_matches: '/*\\\\?*' } },\n { not: { href_matches: '/api/*' } },\n ...exclude.map(pattern => ({ not: { href_matches: pattern } })),\n ],\n },\n eagerness: 'moderate' as const,\n },\n ],\n }\n\n return (\n <script\n type=\"speculationrules\"\n dangerouslySetInnerHTML={{ __html: JSON.stringify(rules) }}\n />\n )\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 { SpeculationRules } from './SpeculationRules'\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 /**\n * Runtime SitemapSync from the visitor's browser. **Default: false.**\n *\n * Sitemap registration is a build-time and server-side job. Build-time\n * `createSitemap` is canonical, and sonor-api's nightly reconciler fetches\n * each host's /sitemap.xml itself, so nothing here needs a visitor.\n *\n * This defaulted to true, and because its throttle lives in sessionStorage\n * and its content hash in localStorage, every first-time visitor, incognito\n * tab and crawler missed both guards and re-POSTed the entire sitemap:\n * upforge.io took ~140 full syncs in a day, queencityriverboats.com ~76.\n * That coupled sitemap traffic to VISITOR COUNT rather than to content\n * changes — exactly backwards — and made every reader pay for platform\n * bookkeeping in bandwidth, XML parsing and an API round-trip.\n *\n * Set true only to re-enable the legacy browser fallback for a site whose\n * build-time registration cannot be made to work.\n */\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 * Emit a Speculation Rules script prerendering same-origin links on intent\n * (Chromium 121+; other browsers ignore it). Zero JS, static-safe. Default\n * false — opt in per site, or pass { mode: 'prefetch' } for the\n * conservative variant.\n */\n speculation?: boolean | { mode?: 'prerender' | 'prefetch'; exclude?: string[] }\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 = false,\n fleet = true,\n defer = true,\n favicon = true,\n managedScripts = true,\n debug = false,\n showLlmsTxtFooterLink = false,\n speculation = 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 {speculation && (\n <SpeculationRules {...(typeof speculation === 'object' ? speculation : {})} />\n )}\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 mapsBrowserKey={\n process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ||\n process.env.GOOGLE_MAPS_BROWSER_KEY ||\n undefined\n }\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"]}
@@ -3,6 +3,7 @@
3
3
  * Kept in a shared file so both server (SiteKitLayout) and client
4
4
  * (SiteKitClientProviders) components can reference them.
5
5
  */
6
+ import type { ChatLauncherPlacement } from '../engage/types';
6
7
  export interface AnalyticsConfig {
7
8
  trackPageViews?: boolean;
8
9
  trackWebVitals?: boolean;
@@ -35,10 +36,15 @@ export interface AnalyticsConfig {
35
36
  * IS the product and its traffic is genuinely yours.
36
37
  */
37
38
  allowInFrame?: boolean;
39
+ /** Report from localhost/loopback browser hosts. Default false. */
40
+ allowLocalhost?: boolean;
38
41
  }
39
- export interface EngageConfig {
40
- position?: 'bottom-right' | 'bottom-left';
41
- zIndex?: number;
42
+ /**
43
+ * Launcher placement (`position`, `offsetBottom`, `zIndex`) comes from
44
+ * ChatLauncherPlacement in engage/types, the one definition every Engage
45
+ * config surface extends.
46
+ */
47
+ export interface EngageConfig extends ChatLauncherPlacement {
42
48
  chatEnabled?: boolean;
43
49
  }
44
50
  export interface SignalConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAA;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/layout/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAE5D,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,mEAAmE;IACnE,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,qBAAqB;IACzD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateLLMsTxt.d.ts","sourceRoot":"","sources":["../../src/llms/generateLLMsTxt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EAQf,MAAM,SAAS,CAAA;AAkEhB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA6SzB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAezB;eAiTc,eAAe"}
1
+ {"version":3,"file":"generateLLMsTxt.d.ts","sourceRoot":"","sources":["../../src/llms/generateLLMsTxt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EAQf,MAAM,SAAS,CAAA;AAkEhB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CA2TzB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAezB;eAgVc,eAAe"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunk5B4FABFK_js = require('../chunk-5B4FABFK.js');
4
- var chunkKMGGAL2X_js = require('../chunk-KMGGAL2X.js');
4
+ var chunkNZSFOZJV_js = require('../chunk-NZSFOZJV.js');
5
5
  require('../chunk-OZ3FU4BT.js');
6
6
  require('../chunk-SWIKKSKL.js');
7
7
  var chunkH6AU3WKF_js = require('../chunk-H6AU3WKF.js');
@@ -39,7 +39,7 @@ function createLLMsTxtHandler(options = {}) {
39
39
  });
40
40
  }
41
41
  }
42
- const { markdown, metadata } = await chunkKMGGAL2X_js.generateLLMsTxt(generateOptions);
42
+ const { markdown, metadata } = await chunkNZSFOZJV_js.generateLLMsTxt(generateOptions);
43
43
  return new Response(markdown, {
44
44
  status: 200,
45
45
  headers: llmsResponseHeaders(markdown, {
@@ -73,7 +73,7 @@ function createLLMsFullTxtHandler(options = {}) {
73
73
  });
74
74
  }
75
75
  }
76
- const { markdown, metadata } = await chunkKMGGAL2X_js.generateLLMsFullTxt(generateOptions);
76
+ const { markdown, metadata } = await chunkNZSFOZJV_js.generateLLMsFullTxt(generateOptions);
77
77
  return new Response(markdown, {
78
78
  status: 200,
79
79
  headers: llmsResponseHeaders(markdown, {
@@ -686,39 +686,39 @@ Object.defineProperty(exports, "buildAiDiscoveryHeaders", {
686
686
  });
687
687
  Object.defineProperty(exports, "generateLLMsFullTxt", {
688
688
  enumerable: true,
689
- get: function () { return chunkKMGGAL2X_js.generateLLMsFullTxt; }
689
+ get: function () { return chunkNZSFOZJV_js.generateLLMsFullTxt; }
690
690
  });
691
691
  Object.defineProperty(exports, "generateLLMsTxt", {
692
692
  enumerable: true,
693
- get: function () { return chunkKMGGAL2X_js.generateLLMsTxt; }
693
+ get: function () { return chunkNZSFOZJV_js.generateLLMsTxt; }
694
694
  });
695
695
  Object.defineProperty(exports, "getBusinessInfo", {
696
696
  enumerable: true,
697
- get: function () { return chunkKMGGAL2X_js.getBusinessInfo; }
697
+ get: function () { return chunkNZSFOZJV_js.getBusinessInfo; }
698
698
  });
699
699
  Object.defineProperty(exports, "getFAQItems", {
700
700
  enumerable: true,
701
- get: function () { return chunkKMGGAL2X_js.getFAQItems; }
701
+ get: function () { return chunkNZSFOZJV_js.getFAQItems; }
702
702
  });
703
703
  Object.defineProperty(exports, "getLLMsData", {
704
704
  enumerable: true,
705
- get: function () { return chunkKMGGAL2X_js.getLLMsData; }
705
+ get: function () { return chunkNZSFOZJV_js.getLLMsData; }
706
706
  });
707
707
  Object.defineProperty(exports, "getOptimizedLLMsTxt", {
708
708
  enumerable: true,
709
- get: function () { return chunkKMGGAL2X_js.getOptimizedLLMsTxt; }
709
+ get: function () { return chunkNZSFOZJV_js.getOptimizedLLMsTxt; }
710
710
  });
711
711
  Object.defineProperty(exports, "getPageSummaries", {
712
712
  enumerable: true,
713
- get: function () { return chunkKMGGAL2X_js.getPageSummaries; }
713
+ get: function () { return chunkNZSFOZJV_js.getPageSummaries; }
714
714
  });
715
715
  Object.defineProperty(exports, "getServices", {
716
716
  enumerable: true,
717
- get: function () { return chunkKMGGAL2X_js.getServices; }
717
+ get: function () { return chunkNZSFOZJV_js.getServices; }
718
718
  });
719
719
  Object.defineProperty(exports, "writeLLMsTxtToPublic", {
720
720
  enumerable: true,
721
- get: function () { return chunkKMGGAL2X_js.writeLLMsTxtToPublic; }
721
+ get: function () { return chunkNZSFOZJV_js.writeLLMsTxtToPublic; }
722
722
  });
723
723
  Object.defineProperty(exports, "LLMS_DISCLAIMER_MAX_LENGTH", {
724
724
  enumerable: true,
@@ -1,6 +1,6 @@
1
1
  export { buildAiDiscoveryHeaders } from '../chunk-H4OBGC43.mjs';
2
- import { generateLLMsTxt, generateLLMsFullTxt } from '../chunk-SZHKNGNR.mjs';
3
- export { generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices, writeLLMsTxtToPublic } from '../chunk-SZHKNGNR.mjs';
2
+ import { generateLLMsTxt, generateLLMsFullTxt } from '../chunk-AEARU24Q.mjs';
3
+ export { generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices, writeLLMsTxtToPublic } from '../chunk-AEARU24Q.mjs';
4
4
  import '../chunk-GZJE23Y5.mjs';
5
5
  import '../chunk-ZN4HBK5C.mjs';
6
6
  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-PENNTSJE.mjs';
@@ -132,7 +132,13 @@ export interface GenerateLLMSTxtOptions {
132
132
  content: string;
133
133
  }>;
134
134
  /**
135
- * Paths (e.g. `/privacy/`) to list under `## Optional` per llmstxt.org (may be skipped by short-context parsers).
135
+ * Paths (e.g. `/privacy`) to demote to `## Optional` per llmstxt.org, the
136
+ * section a short-context parser may skip. Matching pages MOVE there: they
137
+ * leave `## Site Pages` (before `maxPages` is applied, so each one frees an
138
+ * index slot) and keep the URL and note they had in the index. Leading and
139
+ * trailing slashes are ignored when matching. A path with no matching page is
140
+ * still listed under Optional. Needs a resolvable base URL; without one the
141
+ * section is skipped and the pages stay in `## Site Pages`.
136
142
  */
137
143
  optionalPagePaths?: string[];
138
144
  /** When true, append `## Full context` with a link to llms-full.txt */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llms/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llms/types.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkGQ6CUOLA_js = require('../chunk-GQ6CUOLA.js');
5
- require('../chunk-VA36CJRV.js');
6
- require('../chunk-UTOHMK52.js');
4
+ var chunkOC7AO7XS_js = require('../chunk-OC7AO7XS.js');
5
+ require('../chunk-YYN4YZYZ.js');
6
+ require('../chunk-KSL3WA2I.js');
7
7
  require('../chunk-SNAQBZPT.js');
8
8
  var react = require('react');
9
9
  var reactGoogleMaps = require('@vis.gl/react-google-maps');
@@ -141,7 +141,7 @@ async function fetchMapsConfig() {
141
141
  const { apiUrl, apiKey } = getApiConfig();
142
142
  if (apiKey) {
143
143
  try {
144
- const res = await chunkGQ6CUOLA_js.sonorFetch(
144
+ const res = await chunkOC7AO7XS_js.sonorFetch(
145
145
  `${apiUrl}/api/public/maps/config`,
146
146
  { headers: { "Content-Type": "application/json" } },
147
147
  { apiKey }
@@ -181,7 +181,7 @@ async function fetchNearbyPlaces(params) {
181
181
  });
182
182
  if (params.radius) searchParams.set("radius", String(params.radius));
183
183
  if (params.limit) searchParams.set("limit", String(params.limit));
184
- const res = await chunkGQ6CUOLA_js.sonorFetch(
184
+ const res = await chunkOC7AO7XS_js.sonorFetch(
185
185
  `${apiUrl}/api/public/maps/nearby-places?${searchParams}`,
186
186
  { headers: { "Content-Type": "application/json" } },
187
187
  { apiKey }
@@ -1,7 +1,7 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-MIFP6QEQ.mjs';
3
- import '../chunk-I4PDSDVE.mjs';
4
- import '../chunk-7U7C6XRI.mjs';
2
+ import { sonorFetch } from '../chunk-HIHAXEPD.mjs';
3
+ import '../chunk-K2V3ZW36.mjs';
4
+ import '../chunk-DQUBETXH.mjs';
5
5
  import '../chunk-BEXTDHO4.mjs';
6
6
  import { useState, useCallback, useEffect } from 'react';
7
7
  import { APIProvider, Map as Map$1, AdvancedMarker, Pin, InfoWindow } from '@vis.gl/react-google-maps';
@@ -52,9 +52,12 @@ export interface WebMcpToolsProps {
52
52
  * @example
53
53
  * ```tsx
54
54
  * // app/layout.tsx
55
- * <SiteKitLayout analytics={false}>{children}</SiteKitLayout>
56
- * <WebMcpTools tools={MCP_TOOL_DESCRIPTORS} />
55
+ * <SiteKitLayout>{children}</SiteKitLayout>
56
+ * <WebMcpTools endpoint="/api/mcp" />
57
57
  * ```
58
+ *
59
+ * Prefer `endpoint` (discovery) over a `tools` list from a server component:
60
+ * descriptors passed as props land in every page's RSC payload.
58
61
  */
59
62
  export declare function WebMcpTools({ tools, localTools, endpoint, defer, discover, }: WebMcpToolsProps): null;
60
63
  //# sourceMappingURL=WebMcpTools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebMcpTools.d.ts","sourceRoot":"","sources":["../../src/mcp/WebMcpTools.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,SAAS,CAAA;AA6B9D,4DAA4D;AAC5D,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAMD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,gBAAgB,CAAA;CAC9B;AAED,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC3D,yDAAyD;IACzD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;CACvE;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAC9B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,UAAe,EACf,QAAqB,EACrB,KAAY,EACZ,QAAe,GAChB,EAAE,gBAAgB,QAqIlB"}
1
+ {"version":3,"file":"WebMcpTools.d.ts","sourceRoot":"","sources":["../../src/mcp/WebMcpTools.tsx"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,SAAS,CAAA;AA6B9D,4DAA4D;AAC5D,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAMD,2EAA2E;AAC3E,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,gBAAgB,CAAA;CAC9B;AAED,MAAM,WAAW,eAAgB,SAAQ,oBAAoB;IAC3D,yDAAyD;IACzD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;CACvE;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAC9B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,eAAe,EAAE,CAAA;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,UAAe,EACf,QAAqB,EACrB,KAAY,EACZ,QAAe,GAChB,EAAE,gBAAgB,QAqIlB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/WebMcpTools.tsx"],"names":["useDeferredActivation","useEffect"],"mappings":"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","file":"client.js","sourcesContent":["'use client'\n\n/**\n * @sonordev/site-kit/mcp — WebMCP in-page tool registration\n *\n * The browser half of WebMCP (W3C Web Machine Learning CG). When an agent is\n * driving the page — a browser-integrated assistant, an extension, a\n * headless-Chrome operator — it does not fetch our `.well-known` card and open\n * a network connection. It looks for tools registered on the *document*.\n *\n * `document.modelContext.registerTool()` is the current shape in the explainer;\n * earlier drafts and some flagged builds put the same object on `navigator`,\n * and an even earlier one took a whole tool array via `provideContext()`. All\n * three are probed, because the spec is a live draft and a site that only\n * knows one shape silently exposes nothing in the others.\n *\n * ── Why the handlers are proxied ──────────────────────────────────────────\n * Tools are registered here as thin wrappers that POST `tools/call` to this\n * site's own MCP endpoint. That is deliberate:\n *\n * - one implementation. The tool an agent calls in-page and the tool it\n * calls over HTTP run the SAME server-side handler, so they cannot drift.\n * - no secrets in the bundle. Handlers reach Sonor with `SONOR_API_KEY`.\n * Registering real handlers client-side would drag that key into a\n * `'use client'` graph, which is exactly how a raw `sonor_` key once ended\n * up in a public chunk of an upforge build (see build-entries.ts).\n *\n * Tools that genuinely need live DOM state (reading what's on screen, filling\n * a form the user is looking at) are passed as `localTools` and run in-page.\n */\n\nimport { useEffect } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport type { JsonSchemaObject, McpToolResult } from './types'\n\n// ============================================\n// The WebMCP surface, as far as we rely on it\n// ============================================\n\ninterface WebMcpToolDefinition {\n name: string\n description: string\n inputSchema: JsonSchemaObject\n execute: (args: Record<string, unknown>) => Promise<McpToolResult>\n}\n\ninterface ModelContextLike {\n registerTool?: (\n tool: WebMcpToolDefinition,\n options?: { signal?: AbortSignal },\n ) => Promise<unknown> | unknown\n provideContext?: (context: { tools: WebMcpToolDefinition[] }) => Promise<unknown> | unknown\n}\n\nfunction getModelContext(): ModelContextLike | null {\n if (typeof window === 'undefined') return null\n const doc = document as unknown as { modelContext?: ModelContextLike }\n if (doc.modelContext) return doc.modelContext\n const nav = navigator as unknown as { modelContext?: ModelContextLike }\n return nav.modelContext ?? null\n}\n\n/** True when the visiting browser exposes WebMCP at all. */\nexport function isWebMcpAvailable(): boolean {\n return getModelContext() !== null\n}\n\n// ============================================\n// Props\n// ============================================\n\n/** A tool as it crosses the server→client boundary: JSON, no functions. */\nexport interface WebMcpToolDescriptor {\n name: string\n title?: string\n description: string\n inputSchema: JsonSchemaObject\n}\n\nexport interface WebMcpLocalTool extends WebMcpToolDescriptor {\n /** Runs in the browser. Use for DOM-aware tools only. */\n execute: (args: Record<string, unknown>) => Promise<unknown> | unknown\n}\n\nexport interface WebMcpToolsProps {\n /**\n * Proxied tools — executed server-side via the MCP endpoint.\n *\n * Usually omit this. Passing descriptors from a server component sends the\n * whole tool catalog through the RSC payload of EVERY page, costing every\n * human visitor several KB for a capability only an agent uses. Leave it\n * empty and the component fetches `tools/list` instead — but only after\n * confirming the browser actually exposes WebMCP, so the fetch never\n * happens for ordinary visitors. Pass descriptors only to pin a subset.\n */\n tools?: WebMcpToolDescriptor[]\n /** Tools whose handler runs in the browser. */\n localTools?: WebMcpLocalTool[]\n /** MCP endpoint on this origin (default `/api/mcp`). */\n endpoint?: string\n /**\n * Wait for the page to go quiet before registering (default true).\n *\n * Registration is not user-visible and must never compete with hydration.\n * An agent arriving at the page polls or listens for `toolchange`, so a\n * couple of hundred milliseconds costs nothing; a blocked LCP costs a lot.\n */\n defer?: boolean\n /**\n * Fetch the catalog from the endpoint's `tools/list` when no `tools` are\n * passed (default true). The fetch is gated on WebMCP being present.\n */\n discover?: boolean\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * Register this site's MCP tools with the visiting browser's agent.\n *\n * Renders nothing. Mount it as a CHILDLESS sibling in the layout — never as a\n * wrapper around `{children}`, which would de-opt the whole route to client\n * rendering (the cardinal rule in the root CLAUDE.md).\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * <SiteKitLayout analytics={false}>{children}</SiteKitLayout>\n * <WebMcpTools tools={MCP_TOOL_DESCRIPTORS} />\n * ```\n */\nexport function WebMcpTools({\n tools = [],\n localTools = [],\n endpoint = '/api/mcp',\n defer = true,\n discover = true,\n}: WebMcpToolsProps) {\n const ready = useDeferredActivation(defer)\n\n useEffect(() => {\n if (!ready) return\n // Gate EVERYTHING on WebMCP being present. A browser without it does no\n // work and issues no request — which is every human visitor today.\n const modelContext = getModelContext()\n if (!modelContext) return\n\n const controller = new AbortController()\n\n const callRemote = async (\n name: string,\n args: Record<string, unknown>,\n ): Promise<McpToolResult> => {\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/call',\n 'Mcp-Name': name,\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: `webmcp-${name}`,\n method: 'tools/call',\n params: { name, arguments: args },\n }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: McpToolResult\n error?: { message?: string }\n }\n if (payload.error) {\n return {\n content: [{ type: 'text', text: payload.error.message ?? 'Tool call failed.' }],\n isError: true,\n }\n }\n return payload.result ?? { content: [{ type: 'text', text: '(no result)' }] }\n } catch (error) {\n if (controller.signal.aborted) throw error\n const detail = error instanceof Error ? error.message : String(error)\n return { content: [{ type: 'text', text: `Tool call failed: ${detail}` }], isError: true }\n }\n }\n\n const normalize = (value: unknown): McpToolResult => {\n if (value && typeof value === 'object' && Array.isArray((value as McpToolResult).content)) {\n return value as McpToolResult\n }\n return {\n content: [\n { type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) },\n ],\n structuredContent: value,\n }\n }\n\n const proxied = (list: WebMcpToolDescriptor[]): WebMcpToolDefinition[] =>\n list.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: (args: Record<string, unknown>) => callRemote(tool.name, args ?? {}),\n }))\n\n const local = localTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (args: Record<string, unknown>) => normalize(await tool.execute(args ?? {})),\n }))\n\n /** Ask our own endpoint what it serves, so the two can't disagree. */\n const listRemoteTools = async (): Promise<WebMcpToolDescriptor[]> => {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/list',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 'webmcp-list', method: 'tools/list' }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: { tools?: WebMcpToolDescriptor[] }\n }\n return payload.result?.tools ?? []\n }\n\n let cancelled = false\n void (async () => {\n try {\n const discovered =\n tools.length === 0 && discover ? await listRemoteTools() : tools\n if (cancelled) return\n\n const definitions = [...proxied(discovered), ...local]\n if (definitions.length === 0) return\n\n if (typeof modelContext.registerTool === 'function') {\n for (const definition of definitions) {\n if (cancelled) return\n await modelContext.registerTool(definition, { signal: controller.signal })\n }\n } else if (typeof modelContext.provideContext === 'function') {\n await modelContext.provideContext({ tools: definitions })\n }\n } catch (error) {\n // A draft API that rejects is not a site error. Stay silent in\n // production so a spec change never shows up as console noise on a\n // marketing page.\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[site-kit/mcp] WebMCP registration failed:', error)\n }\n }\n })()\n\n return () => {\n cancelled = true\n // Aborting the signal is how WebMCP unregisters — important on client\n // navigation, or the previous page's tools linger on the document.\n controller.abort()\n }\n }, [ready, tools, localTools, endpoint, discover])\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../../src/mcp/WebMcpTools.tsx"],"names":["useDeferredActivation","useEffect"],"mappings":"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","file":"client.js","sourcesContent":["'use client'\n\n/**\n * @sonordev/site-kit/mcp — WebMCP in-page tool registration\n *\n * The browser half of WebMCP (W3C Web Machine Learning CG). When an agent is\n * driving the page — a browser-integrated assistant, an extension, a\n * headless-Chrome operator — it does not fetch our `.well-known` card and open\n * a network connection. It looks for tools registered on the *document*.\n *\n * `document.modelContext.registerTool()` is the current shape in the explainer;\n * earlier drafts and some flagged builds put the same object on `navigator`,\n * and an even earlier one took a whole tool array via `provideContext()`. All\n * three are probed, because the spec is a live draft and a site that only\n * knows one shape silently exposes nothing in the others.\n *\n * ── Why the handlers are proxied ──────────────────────────────────────────\n * Tools are registered here as thin wrappers that POST `tools/call` to this\n * site's own MCP endpoint. That is deliberate:\n *\n * - one implementation. The tool an agent calls in-page and the tool it\n * calls over HTTP run the SAME server-side handler, so they cannot drift.\n * - no secrets in the bundle. Handlers reach Sonor with `SONOR_API_KEY`.\n * Registering real handlers client-side would drag that key into a\n * `'use client'` graph, which is exactly how a raw `sonor_` key once ended\n * up in a public chunk of an upforge build (see build-entries.ts).\n *\n * Tools that genuinely need live DOM state (reading what's on screen, filling\n * a form the user is looking at) are passed as `localTools` and run in-page.\n */\n\nimport { useEffect } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport type { JsonSchemaObject, McpToolResult } from './types'\n\n// ============================================\n// The WebMCP surface, as far as we rely on it\n// ============================================\n\ninterface WebMcpToolDefinition {\n name: string\n description: string\n inputSchema: JsonSchemaObject\n execute: (args: Record<string, unknown>) => Promise<McpToolResult>\n}\n\ninterface ModelContextLike {\n registerTool?: (\n tool: WebMcpToolDefinition,\n options?: { signal?: AbortSignal },\n ) => Promise<unknown> | unknown\n provideContext?: (context: { tools: WebMcpToolDefinition[] }) => Promise<unknown> | unknown\n}\n\nfunction getModelContext(): ModelContextLike | null {\n if (typeof window === 'undefined') return null\n const doc = document as unknown as { modelContext?: ModelContextLike }\n if (doc.modelContext) return doc.modelContext\n const nav = navigator as unknown as { modelContext?: ModelContextLike }\n return nav.modelContext ?? null\n}\n\n/** True when the visiting browser exposes WebMCP at all. */\nexport function isWebMcpAvailable(): boolean {\n return getModelContext() !== null\n}\n\n// ============================================\n// Props\n// ============================================\n\n/** A tool as it crosses the server→client boundary: JSON, no functions. */\nexport interface WebMcpToolDescriptor {\n name: string\n title?: string\n description: string\n inputSchema: JsonSchemaObject\n}\n\nexport interface WebMcpLocalTool extends WebMcpToolDescriptor {\n /** Runs in the browser. Use for DOM-aware tools only. */\n execute: (args: Record<string, unknown>) => Promise<unknown> | unknown\n}\n\nexport interface WebMcpToolsProps {\n /**\n * Proxied tools — executed server-side via the MCP endpoint.\n *\n * Usually omit this. Passing descriptors from a server component sends the\n * whole tool catalog through the RSC payload of EVERY page, costing every\n * human visitor several KB for a capability only an agent uses. Leave it\n * empty and the component fetches `tools/list` instead — but only after\n * confirming the browser actually exposes WebMCP, so the fetch never\n * happens for ordinary visitors. Pass descriptors only to pin a subset.\n */\n tools?: WebMcpToolDescriptor[]\n /** Tools whose handler runs in the browser. */\n localTools?: WebMcpLocalTool[]\n /** MCP endpoint on this origin (default `/api/mcp`). */\n endpoint?: string\n /**\n * Wait for the page to go quiet before registering (default true).\n *\n * Registration is not user-visible and must never compete with hydration.\n * An agent arriving at the page polls or listens for `toolchange`, so a\n * couple of hundred milliseconds costs nothing; a blocked LCP costs a lot.\n */\n defer?: boolean\n /**\n * Fetch the catalog from the endpoint's `tools/list` when no `tools` are\n * passed (default true). The fetch is gated on WebMCP being present.\n */\n discover?: boolean\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * Register this site's MCP tools with the visiting browser's agent.\n *\n * Renders nothing. Mount it as a CHILDLESS sibling in the layout — never as a\n * wrapper around `{children}`, which would de-opt the whole route to client\n * rendering (the cardinal rule in the root CLAUDE.md).\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * <SiteKitLayout>{children}</SiteKitLayout>\n * <WebMcpTools endpoint=\"/api/mcp\" />\n * ```\n *\n * Prefer `endpoint` (discovery) over a `tools` list from a server component:\n * descriptors passed as props land in every page's RSC payload.\n */\nexport function WebMcpTools({\n tools = [],\n localTools = [],\n endpoint = '/api/mcp',\n defer = true,\n discover = true,\n}: WebMcpToolsProps) {\n const ready = useDeferredActivation(defer)\n\n useEffect(() => {\n if (!ready) return\n // Gate EVERYTHING on WebMCP being present. A browser without it does no\n // work and issues no request — which is every human visitor today.\n const modelContext = getModelContext()\n if (!modelContext) return\n\n const controller = new AbortController()\n\n const callRemote = async (\n name: string,\n args: Record<string, unknown>,\n ): Promise<McpToolResult> => {\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/call',\n 'Mcp-Name': name,\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: `webmcp-${name}`,\n method: 'tools/call',\n params: { name, arguments: args },\n }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: McpToolResult\n error?: { message?: string }\n }\n if (payload.error) {\n return {\n content: [{ type: 'text', text: payload.error.message ?? 'Tool call failed.' }],\n isError: true,\n }\n }\n return payload.result ?? { content: [{ type: 'text', text: '(no result)' }] }\n } catch (error) {\n if (controller.signal.aborted) throw error\n const detail = error instanceof Error ? error.message : String(error)\n return { content: [{ type: 'text', text: `Tool call failed: ${detail}` }], isError: true }\n }\n }\n\n const normalize = (value: unknown): McpToolResult => {\n if (value && typeof value === 'object' && Array.isArray((value as McpToolResult).content)) {\n return value as McpToolResult\n }\n return {\n content: [\n { type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) },\n ],\n structuredContent: value,\n }\n }\n\n const proxied = (list: WebMcpToolDescriptor[]): WebMcpToolDefinition[] =>\n list.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: (args: Record<string, unknown>) => callRemote(tool.name, args ?? {}),\n }))\n\n const local = localTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (args: Record<string, unknown>) => normalize(await tool.execute(args ?? {})),\n }))\n\n /** Ask our own endpoint what it serves, so the two can't disagree. */\n const listRemoteTools = async (): Promise<WebMcpToolDescriptor[]> => {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/list',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 'webmcp-list', method: 'tools/list' }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: { tools?: WebMcpToolDescriptor[] }\n }\n return payload.result?.tools ?? []\n }\n\n let cancelled = false\n void (async () => {\n try {\n const discovered =\n tools.length === 0 && discover ? await listRemoteTools() : tools\n if (cancelled) return\n\n const definitions = [...proxied(discovered), ...local]\n if (definitions.length === 0) return\n\n if (typeof modelContext.registerTool === 'function') {\n for (const definition of definitions) {\n if (cancelled) return\n await modelContext.registerTool(definition, { signal: controller.signal })\n }\n } else if (typeof modelContext.provideContext === 'function') {\n await modelContext.provideContext({ tools: definitions })\n }\n } catch (error) {\n // A draft API that rejects is not a site error. Stay silent in\n // production so a spec change never shows up as console noise on a\n // marketing page.\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[site-kit/mcp] WebMCP registration failed:', error)\n }\n }\n })()\n\n return () => {\n cancelled = true\n // Aborting the signal is how WebMCP unregisters — important on client\n // navigation, or the previous page's tools linger on the document.\n controller.abort()\n }\n }, [ready, tools, localTools, endpoint, discover])\n\n return null\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/WebMcpTools.tsx"],"names":[],"mappings":"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","file":"client.mjs","sourcesContent":["'use client'\n\n/**\n * @sonordev/site-kit/mcp — WebMCP in-page tool registration\n *\n * The browser half of WebMCP (W3C Web Machine Learning CG). When an agent is\n * driving the page — a browser-integrated assistant, an extension, a\n * headless-Chrome operator — it does not fetch our `.well-known` card and open\n * a network connection. It looks for tools registered on the *document*.\n *\n * `document.modelContext.registerTool()` is the current shape in the explainer;\n * earlier drafts and some flagged builds put the same object on `navigator`,\n * and an even earlier one took a whole tool array via `provideContext()`. All\n * three are probed, because the spec is a live draft and a site that only\n * knows one shape silently exposes nothing in the others.\n *\n * ── Why the handlers are proxied ──────────────────────────────────────────\n * Tools are registered here as thin wrappers that POST `tools/call` to this\n * site's own MCP endpoint. That is deliberate:\n *\n * - one implementation. The tool an agent calls in-page and the tool it\n * calls over HTTP run the SAME server-side handler, so they cannot drift.\n * - no secrets in the bundle. Handlers reach Sonor with `SONOR_API_KEY`.\n * Registering real handlers client-side would drag that key into a\n * `'use client'` graph, which is exactly how a raw `sonor_` key once ended\n * up in a public chunk of an upforge build (see build-entries.ts).\n *\n * Tools that genuinely need live DOM state (reading what's on screen, filling\n * a form the user is looking at) are passed as `localTools` and run in-page.\n */\n\nimport { useEffect } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport type { JsonSchemaObject, McpToolResult } from './types'\n\n// ============================================\n// The WebMCP surface, as far as we rely on it\n// ============================================\n\ninterface WebMcpToolDefinition {\n name: string\n description: string\n inputSchema: JsonSchemaObject\n execute: (args: Record<string, unknown>) => Promise<McpToolResult>\n}\n\ninterface ModelContextLike {\n registerTool?: (\n tool: WebMcpToolDefinition,\n options?: { signal?: AbortSignal },\n ) => Promise<unknown> | unknown\n provideContext?: (context: { tools: WebMcpToolDefinition[] }) => Promise<unknown> | unknown\n}\n\nfunction getModelContext(): ModelContextLike | null {\n if (typeof window === 'undefined') return null\n const doc = document as unknown as { modelContext?: ModelContextLike }\n if (doc.modelContext) return doc.modelContext\n const nav = navigator as unknown as { modelContext?: ModelContextLike }\n return nav.modelContext ?? null\n}\n\n/** True when the visiting browser exposes WebMCP at all. */\nexport function isWebMcpAvailable(): boolean {\n return getModelContext() !== null\n}\n\n// ============================================\n// Props\n// ============================================\n\n/** A tool as it crosses the server→client boundary: JSON, no functions. */\nexport interface WebMcpToolDescriptor {\n name: string\n title?: string\n description: string\n inputSchema: JsonSchemaObject\n}\n\nexport interface WebMcpLocalTool extends WebMcpToolDescriptor {\n /** Runs in the browser. Use for DOM-aware tools only. */\n execute: (args: Record<string, unknown>) => Promise<unknown> | unknown\n}\n\nexport interface WebMcpToolsProps {\n /**\n * Proxied tools — executed server-side via the MCP endpoint.\n *\n * Usually omit this. Passing descriptors from a server component sends the\n * whole tool catalog through the RSC payload of EVERY page, costing every\n * human visitor several KB for a capability only an agent uses. Leave it\n * empty and the component fetches `tools/list` instead — but only after\n * confirming the browser actually exposes WebMCP, so the fetch never\n * happens for ordinary visitors. Pass descriptors only to pin a subset.\n */\n tools?: WebMcpToolDescriptor[]\n /** Tools whose handler runs in the browser. */\n localTools?: WebMcpLocalTool[]\n /** MCP endpoint on this origin (default `/api/mcp`). */\n endpoint?: string\n /**\n * Wait for the page to go quiet before registering (default true).\n *\n * Registration is not user-visible and must never compete with hydration.\n * An agent arriving at the page polls or listens for `toolchange`, so a\n * couple of hundred milliseconds costs nothing; a blocked LCP costs a lot.\n */\n defer?: boolean\n /**\n * Fetch the catalog from the endpoint's `tools/list` when no `tools` are\n * passed (default true). The fetch is gated on WebMCP being present.\n */\n discover?: boolean\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * Register this site's MCP tools with the visiting browser's agent.\n *\n * Renders nothing. Mount it as a CHILDLESS sibling in the layout — never as a\n * wrapper around `{children}`, which would de-opt the whole route to client\n * rendering (the cardinal rule in the root CLAUDE.md).\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * <SiteKitLayout analytics={false}>{children}</SiteKitLayout>\n * <WebMcpTools tools={MCP_TOOL_DESCRIPTORS} />\n * ```\n */\nexport function WebMcpTools({\n tools = [],\n localTools = [],\n endpoint = '/api/mcp',\n defer = true,\n discover = true,\n}: WebMcpToolsProps) {\n const ready = useDeferredActivation(defer)\n\n useEffect(() => {\n if (!ready) return\n // Gate EVERYTHING on WebMCP being present. A browser without it does no\n // work and issues no request — which is every human visitor today.\n const modelContext = getModelContext()\n if (!modelContext) return\n\n const controller = new AbortController()\n\n const callRemote = async (\n name: string,\n args: Record<string, unknown>,\n ): Promise<McpToolResult> => {\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/call',\n 'Mcp-Name': name,\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: `webmcp-${name}`,\n method: 'tools/call',\n params: { name, arguments: args },\n }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: McpToolResult\n error?: { message?: string }\n }\n if (payload.error) {\n return {\n content: [{ type: 'text', text: payload.error.message ?? 'Tool call failed.' }],\n isError: true,\n }\n }\n return payload.result ?? { content: [{ type: 'text', text: '(no result)' }] }\n } catch (error) {\n if (controller.signal.aborted) throw error\n const detail = error instanceof Error ? error.message : String(error)\n return { content: [{ type: 'text', text: `Tool call failed: ${detail}` }], isError: true }\n }\n }\n\n const normalize = (value: unknown): McpToolResult => {\n if (value && typeof value === 'object' && Array.isArray((value as McpToolResult).content)) {\n return value as McpToolResult\n }\n return {\n content: [\n { type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) },\n ],\n structuredContent: value,\n }\n }\n\n const proxied = (list: WebMcpToolDescriptor[]): WebMcpToolDefinition[] =>\n list.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: (args: Record<string, unknown>) => callRemote(tool.name, args ?? {}),\n }))\n\n const local = localTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (args: Record<string, unknown>) => normalize(await tool.execute(args ?? {})),\n }))\n\n /** Ask our own endpoint what it serves, so the two can't disagree. */\n const listRemoteTools = async (): Promise<WebMcpToolDescriptor[]> => {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/list',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 'webmcp-list', method: 'tools/list' }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: { tools?: WebMcpToolDescriptor[] }\n }\n return payload.result?.tools ?? []\n }\n\n let cancelled = false\n void (async () => {\n try {\n const discovered =\n tools.length === 0 && discover ? await listRemoteTools() : tools\n if (cancelled) return\n\n const definitions = [...proxied(discovered), ...local]\n if (definitions.length === 0) return\n\n if (typeof modelContext.registerTool === 'function') {\n for (const definition of definitions) {\n if (cancelled) return\n await modelContext.registerTool(definition, { signal: controller.signal })\n }\n } else if (typeof modelContext.provideContext === 'function') {\n await modelContext.provideContext({ tools: definitions })\n }\n } catch (error) {\n // A draft API that rejects is not a site error. Stay silent in\n // production so a spec change never shows up as console noise on a\n // marketing page.\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[site-kit/mcp] WebMCP registration failed:', error)\n }\n }\n })()\n\n return () => {\n cancelled = true\n // Aborting the signal is how WebMCP unregisters — important on client\n // navigation, or the previous page's tools linger on the document.\n controller.abort()\n }\n }, [ready, tools, localTools, endpoint, discover])\n\n return null\n}\n"]}
1
+ {"version":3,"sources":["../../src/mcp/WebMcpTools.tsx"],"names":[],"mappings":"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","file":"client.mjs","sourcesContent":["'use client'\n\n/**\n * @sonordev/site-kit/mcp — WebMCP in-page tool registration\n *\n * The browser half of WebMCP (W3C Web Machine Learning CG). When an agent is\n * driving the page — a browser-integrated assistant, an extension, a\n * headless-Chrome operator — it does not fetch our `.well-known` card and open\n * a network connection. It looks for tools registered on the *document*.\n *\n * `document.modelContext.registerTool()` is the current shape in the explainer;\n * earlier drafts and some flagged builds put the same object on `navigator`,\n * and an even earlier one took a whole tool array via `provideContext()`. All\n * three are probed, because the spec is a live draft and a site that only\n * knows one shape silently exposes nothing in the others.\n *\n * ── Why the handlers are proxied ──────────────────────────────────────────\n * Tools are registered here as thin wrappers that POST `tools/call` to this\n * site's own MCP endpoint. That is deliberate:\n *\n * - one implementation. The tool an agent calls in-page and the tool it\n * calls over HTTP run the SAME server-side handler, so they cannot drift.\n * - no secrets in the bundle. Handlers reach Sonor with `SONOR_API_KEY`.\n * Registering real handlers client-side would drag that key into a\n * `'use client'` graph, which is exactly how a raw `sonor_` key once ended\n * up in a public chunk of an upforge build (see build-entries.ts).\n *\n * Tools that genuinely need live DOM state (reading what's on screen, filling\n * a form the user is looking at) are passed as `localTools` and run in-page.\n */\n\nimport { useEffect } from 'react'\nimport { useDeferredActivation } from '../shared/defer'\nimport type { JsonSchemaObject, McpToolResult } from './types'\n\n// ============================================\n// The WebMCP surface, as far as we rely on it\n// ============================================\n\ninterface WebMcpToolDefinition {\n name: string\n description: string\n inputSchema: JsonSchemaObject\n execute: (args: Record<string, unknown>) => Promise<McpToolResult>\n}\n\ninterface ModelContextLike {\n registerTool?: (\n tool: WebMcpToolDefinition,\n options?: { signal?: AbortSignal },\n ) => Promise<unknown> | unknown\n provideContext?: (context: { tools: WebMcpToolDefinition[] }) => Promise<unknown> | unknown\n}\n\nfunction getModelContext(): ModelContextLike | null {\n if (typeof window === 'undefined') return null\n const doc = document as unknown as { modelContext?: ModelContextLike }\n if (doc.modelContext) return doc.modelContext\n const nav = navigator as unknown as { modelContext?: ModelContextLike }\n return nav.modelContext ?? null\n}\n\n/** True when the visiting browser exposes WebMCP at all. */\nexport function isWebMcpAvailable(): boolean {\n return getModelContext() !== null\n}\n\n// ============================================\n// Props\n// ============================================\n\n/** A tool as it crosses the server→client boundary: JSON, no functions. */\nexport interface WebMcpToolDescriptor {\n name: string\n title?: string\n description: string\n inputSchema: JsonSchemaObject\n}\n\nexport interface WebMcpLocalTool extends WebMcpToolDescriptor {\n /** Runs in the browser. Use for DOM-aware tools only. */\n execute: (args: Record<string, unknown>) => Promise<unknown> | unknown\n}\n\nexport interface WebMcpToolsProps {\n /**\n * Proxied tools — executed server-side via the MCP endpoint.\n *\n * Usually omit this. Passing descriptors from a server component sends the\n * whole tool catalog through the RSC payload of EVERY page, costing every\n * human visitor several KB for a capability only an agent uses. Leave it\n * empty and the component fetches `tools/list` instead — but only after\n * confirming the browser actually exposes WebMCP, so the fetch never\n * happens for ordinary visitors. Pass descriptors only to pin a subset.\n */\n tools?: WebMcpToolDescriptor[]\n /** Tools whose handler runs in the browser. */\n localTools?: WebMcpLocalTool[]\n /** MCP endpoint on this origin (default `/api/mcp`). */\n endpoint?: string\n /**\n * Wait for the page to go quiet before registering (default true).\n *\n * Registration is not user-visible and must never compete with hydration.\n * An agent arriving at the page polls or listens for `toolchange`, so a\n * couple of hundred milliseconds costs nothing; a blocked LCP costs a lot.\n */\n defer?: boolean\n /**\n * Fetch the catalog from the endpoint's `tools/list` when no `tools` are\n * passed (default true). The fetch is gated on WebMCP being present.\n */\n discover?: boolean\n}\n\n// ============================================\n// Component\n// ============================================\n\n/**\n * Register this site's MCP tools with the visiting browser's agent.\n *\n * Renders nothing. Mount it as a CHILDLESS sibling in the layout — never as a\n * wrapper around `{children}`, which would de-opt the whole route to client\n * rendering (the cardinal rule in the root CLAUDE.md).\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * <SiteKitLayout>{children}</SiteKitLayout>\n * <WebMcpTools endpoint=\"/api/mcp\" />\n * ```\n *\n * Prefer `endpoint` (discovery) over a `tools` list from a server component:\n * descriptors passed as props land in every page's RSC payload.\n */\nexport function WebMcpTools({\n tools = [],\n localTools = [],\n endpoint = '/api/mcp',\n defer = true,\n discover = true,\n}: WebMcpToolsProps) {\n const ready = useDeferredActivation(defer)\n\n useEffect(() => {\n if (!ready) return\n // Gate EVERYTHING on WebMCP being present. A browser without it does no\n // work and issues no request — which is every human visitor today.\n const modelContext = getModelContext()\n if (!modelContext) return\n\n const controller = new AbortController()\n\n const callRemote = async (\n name: string,\n args: Record<string, unknown>,\n ): Promise<McpToolResult> => {\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/call',\n 'Mcp-Name': name,\n },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: `webmcp-${name}`,\n method: 'tools/call',\n params: { name, arguments: args },\n }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: McpToolResult\n error?: { message?: string }\n }\n if (payload.error) {\n return {\n content: [{ type: 'text', text: payload.error.message ?? 'Tool call failed.' }],\n isError: true,\n }\n }\n return payload.result ?? { content: [{ type: 'text', text: '(no result)' }] }\n } catch (error) {\n if (controller.signal.aborted) throw error\n const detail = error instanceof Error ? error.message : String(error)\n return { content: [{ type: 'text', text: `Tool call failed: ${detail}` }], isError: true }\n }\n }\n\n const normalize = (value: unknown): McpToolResult => {\n if (value && typeof value === 'object' && Array.isArray((value as McpToolResult).content)) {\n return value as McpToolResult\n }\n return {\n content: [\n { type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) },\n ],\n structuredContent: value,\n }\n }\n\n const proxied = (list: WebMcpToolDescriptor[]): WebMcpToolDefinition[] =>\n list.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: (args: Record<string, unknown>) => callRemote(tool.name, args ?? {}),\n }))\n\n const local = localTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (args: Record<string, unknown>) => normalize(await tool.execute(args ?? {})),\n }))\n\n /** Ask our own endpoint what it serves, so the two can't disagree. */\n const listRemoteTools = async (): Promise<WebMcpToolDescriptor[]> => {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n 'Mcp-Method': 'tools/list',\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: 'webmcp-list', method: 'tools/list' }),\n signal: controller.signal,\n })\n const payload = (await response.json()) as {\n result?: { tools?: WebMcpToolDescriptor[] }\n }\n return payload.result?.tools ?? []\n }\n\n let cancelled = false\n void (async () => {\n try {\n const discovered =\n tools.length === 0 && discover ? await listRemoteTools() : tools\n if (cancelled) return\n\n const definitions = [...proxied(discovered), ...local]\n if (definitions.length === 0) return\n\n if (typeof modelContext.registerTool === 'function') {\n for (const definition of definitions) {\n if (cancelled) return\n await modelContext.registerTool(definition, { signal: controller.signal })\n }\n } else if (typeof modelContext.provideContext === 'function') {\n await modelContext.provideContext({ tools: definitions })\n }\n } catch (error) {\n // A draft API that rejects is not a site error. Stay silent in\n // production so a spec change never shows up as console noise on a\n // marketing page.\n if (process.env.NODE_ENV !== 'production') {\n console.warn('[site-kit/mcp] WebMCP registration failed:', error)\n }\n }\n })()\n\n return () => {\n cancelled = true\n // Aborting the signal is how WebMCP unregisters — important on client\n // navigation, or the previous page's tools linger on the document.\n controller.abort()\n }\n }, [ready, tools, localTools, endpoint, discover])\n\n return null\n}\n"]}
@@ -2,9 +2,9 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkG2WC3CXW_js = require('../chunk-G2WC3CXW.js');
5
- var chunkGQ6CUOLA_js = require('../chunk-GQ6CUOLA.js');
6
- require('../chunk-VA36CJRV.js');
7
- require('../chunk-UTOHMK52.js');
5
+ var chunkOC7AO7XS_js = require('../chunk-OC7AO7XS.js');
6
+ require('../chunk-YYN4YZYZ.js');
7
+ require('../chunk-KSL3WA2I.js');
8
8
  require('../chunk-SNAQBZPT.js');
9
9
  var react = require('react');
10
10
  var jsxRuntime = require('react/jsx-runtime');
@@ -39,7 +39,7 @@ function useSiteSearch(options = {}) {
39
39
  const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
40
40
  const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
41
41
  const resolvedSite = site ?? (typeof window !== "undefined" ? window.__SITE_KIT_SITE__ : void 0);
42
- const res = await chunkGQ6CUOLA_js.sonorFetch(
42
+ const res = await chunkOC7AO7XS_js.sonorFetch(
43
43
  `${apiUrl}${chunkG2WC3CXW_js.SEARCH_ENDPOINT}`,
44
44
  {
45
45
  method: "POST",
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { SEARCH_ENDPOINT } from '../chunk-75A4KY4X.mjs';
3
3
  export { SEARCH_ENDPOINT } from '../chunk-75A4KY4X.mjs';
4
- import { sonorFetch } from '../chunk-MIFP6QEQ.mjs';
5
- import '../chunk-I4PDSDVE.mjs';
6
- import '../chunk-7U7C6XRI.mjs';
4
+ import { sonorFetch } from '../chunk-HIHAXEPD.mjs';
5
+ import '../chunk-K2V3ZW36.mjs';
6
+ import '../chunk-DQUBETXH.mjs';
7
7
  import '../chunk-BEXTDHO4.mjs';
8
8
  import { useState, useRef, useCallback, useEffect } from 'react';
9
9
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,9 +1,10 @@
1
1
  /**
2
- * @deprecated DO NOT USE. This component calls an endpoint that does not exist
3
- * (and sends project_id from the client, violating the x-api-key-only auth
4
- * contract) — it has only ever rendered its fallback. Location page content is
5
- * served through the standard managed-content path instead. Kept exported so
6
- * existing imports keep compiling; it renders the fallback and warns.
2
+ * @deprecated DO NOT USE in new code. It POSTs `project_id` to the public
3
+ * `/api/public/seo/location-content` route with no `x-api-key`, violating the
4
+ * key-only auth contract every other site-kit fetch follows (the route itself
5
+ * exists and answers for any project id). No site in the workspace renders it.
6
+ * Kept exported so existing imports keep compiling; it renders the section when
7
+ * the route returns one and `fallback` otherwise.
7
8
  *
8
9
  * LocationPageContent - Server Component for fetching location page sections
9
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"LocationPageContent.d.ts","sourceRoot":"","sources":["../../src/seo/LocationPageContent.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAA;IACf,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,KAAK,CAAC,SAAS,CAAA;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,GAAG,CAAA;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAeD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,cAClB,MAAM,QACX,MAAM,WACH,MAAM,KACd,OAAO,CAAC,mBAAmB,GAAG,IAAI,CA0BnC,CAAA;AA4IF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,KAAK,CAAC,YAAY,CAMvF;AAGD,YAAY,EACV,kBAAkB,IAAI,mBAAmB,EACzC,kBAAkB,IAAI,uBAAuB,EAC7C,kBAAkB,IAAI,mBAAmB,GAC1C,CAAA"}
1
+ {"version":3,"file":"LocationPageContent.d.ts","sourceRoot":"","sources":["../../src/seo/LocationPageContent.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAO9B,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAA;IACf,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,KAAK,CAAC,SAAS,CAAA;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,GAAG,CAAA;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAeD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,cAClB,MAAM,QACX,MAAM,WACH,MAAM,KACd,OAAO,CAAC,mBAAmB,GAAG,IAAI,CA0BnC,CAAA;AA4IF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,KAAK,CAAC,YAAY,CAMvF;AAGD,YAAY,EACV,kBAAkB,IAAI,mBAAmB,EACzC,kBAAkB,IAAI,uBAAuB,EAC7C,kBAAkB,IAAI,mBAAmB,GAC1C,CAAA"}
package/dist/seo/api.d.ts CHANGED
@@ -6,10 +6,9 @@
6
6
  *
7
7
  * This file is kept for backward compatibility but will be removed in a future version.
8
8
  *
9
- * Migration guide:
10
- * - Replace: import { getSEOPageData } from '@sonordev/seo/api'
11
- * - With: import { getSEOPageData } from '@sonordev/seo/server'
12
- * - Use private env var: SONOR_API_KEY
9
+ * Not a package entry (there is no `@sonordev/site-kit/seo/api`); the only
10
+ * importer is the `og` CLI command. Everything else uses server-api.ts via
11
+ * `@sonordev/site-kit/seo` or `@sonordev/site-kit/seo/server`.
13
12
  */
14
13
  /**
15
14
  * Fetch SEO page data - cached per request
@@ -73,7 +72,7 @@ export declare const getSitemapEntries: (projectId: string, options?: {
73
72
  * @example
74
73
  * ```ts
75
74
  * // scripts/register-sitemap.ts (run at build time)
76
- * import { registerSitemap } from '@sonordev/seo/server'
75
+ * import { registerSitemap } from '@sonordev/site-kit/seo/server'
77
76
  *
78
77
  * await registerSitemap([
79
78
  * { path: '/', priority: 1.0, changefreq: 'daily' },
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/seo/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/seo/api.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,19 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkU53KN4SA_js = require('../chunk-U53KN4SA.js');
4
+ var chunkXR32C47O_js = require('../chunk-XR32C47O.js');
5
5
  require('../chunk-JEOKDUPQ.js');
6
- require('../chunk-OL2QBWAU.js');
7
- require('../chunk-GQ6CUOLA.js');
8
- require('../chunk-VA36CJRV.js');
9
- require('../chunk-UTOHMK52.js');
6
+ require('../chunk-5RNAUYWE.js');
7
+ require('../chunk-OC7AO7XS.js');
8
+ require('../chunk-YYN4YZYZ.js');
9
+ require('../chunk-KSL3WA2I.js');
10
10
  require('../chunk-SNAQBZPT.js');
11
11
 
12
12
 
13
13
 
14
14
  Object.defineProperty(exports, "SitemapSync", {
15
15
  enumerable: true,
16
- get: function () { return chunkU53KN4SA_js.SitemapSync; }
16
+ get: function () { return chunkXR32C47O_js.SitemapSync; }
17
17
  });
18
18
  //# sourceMappingURL=client.js.map
19
19
  //# sourceMappingURL=client.js.map