@sonordev/site-kit 5.5.0 → 5.7.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 (392) hide show
  1. package/agent-manifest.json +11 -3
  2. package/dist/AnalyticsProvider-EWF7JN2X.mjs +11 -0
  3. package/dist/{AnalyticsProvider-KFXAH4GR.mjs.map → AnalyticsProvider-EWF7JN2X.mjs.map} +1 -1
  4. package/dist/AnalyticsProvider-GJFG7YXA.js +32 -0
  5. package/dist/{AnalyticsProvider-WDDW3IJW.js.map → AnalyticsProvider-GJFG7YXA.js.map} +1 -1
  6. package/dist/{BlogViewTracker-D4DIEP4Q.js → BlogViewTracker-2D3IJPJK.js} +6 -6
  7. package/dist/{BlogViewTracker-D4DIEP4Q.js.map → BlogViewTracker-2D3IJPJK.js.map} +1 -1
  8. package/dist/{BlogViewTracker-ZVEGGH3Y.mjs → BlogViewTracker-CKYG6MYU.mjs} +5 -5
  9. package/dist/{BlogViewTracker-ZVEGGH3Y.mjs.map → BlogViewTracker-CKYG6MYU.mjs.map} +1 -1
  10. package/dist/ChatWidget-AWP6GBVW.js +22 -0
  11. package/dist/{ChatWidget-2ZYPYIMQ.js.map → ChatWidget-AWP6GBVW.js.map} +1 -1
  12. package/dist/ChatWidget-Z5QXDZP3.mjs +13 -0
  13. package/dist/{ChatWidget-FYCCLMQE.mjs.map → ChatWidget-Z5QXDZP3.mjs.map} +1 -1
  14. package/dist/EngageWidget-BKEY5TPO.mjs +12 -0
  15. package/dist/{EngageWidget-6HUZYOY7.mjs.map → EngageWidget-BKEY5TPO.mjs.map} +1 -1
  16. package/dist/EngageWidget-VT4DYXVO.js +21 -0
  17. package/dist/{EngageWidget-MYQTBBW6.js.map → EngageWidget-VT4DYXVO.js.map} +1 -1
  18. package/dist/{FileField-JK2S24XU.js → FileField-62ZWZMQK.js} +6 -6
  19. package/dist/{FileField-JK2S24XU.js.map → FileField-62ZWZMQK.js.map} +1 -1
  20. package/dist/{FileField-OZZHWGPA.mjs → FileField-JJN5QKDL.mjs} +5 -5
  21. package/dist/{FileField-OZZHWGPA.mjs.map → FileField-JJN5QKDL.mjs.map} +1 -1
  22. package/dist/{FormSpotlight-XV42L72H.mjs → FormSpotlight-OTFB6QM5.mjs} +3 -3
  23. package/dist/{FormSpotlight-XV42L72H.mjs.map → FormSpotlight-OTFB6QM5.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-5AXFQU5M.js → FormSpotlight-URS4XRS7.js} +15 -15
  25. package/dist/{FormSpotlight-5AXFQU5M.js.map → FormSpotlight-URS4XRS7.js.map} +1 -1
  26. package/dist/{FormStage-HATUHNRV.js → FormStage-FVKMIV73.js} +13 -13
  27. package/dist/{FormStage-HATUHNRV.js.map → FormStage-FVKMIV73.js.map} +1 -1
  28. package/dist/{FormStage-RUK675HV.mjs → FormStage-VPGOCMAV.mjs} +3 -3
  29. package/dist/{FormStage-RUK675HV.mjs.map → FormStage-VPGOCMAV.mjs.map} +1 -1
  30. package/dist/ManagedForm-CXVDJMHN.mjs +14 -0
  31. package/dist/{ManagedForm-OA3MNGXT.mjs.map → ManagedForm-CXVDJMHN.mjs.map} +1 -1
  32. package/dist/ManagedForm-FGNTDGED.js +23 -0
  33. package/dist/{ManagedForm-JWEXJEXK.js.map → ManagedForm-FGNTDGED.js.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-AAHH63KT.js → ManagedNewsletterForm-3O5L44AZ.js} +8 -8
  35. package/dist/{ManagedNewsletterForm-AAHH63KT.js.map → ManagedNewsletterForm-3O5L44AZ.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-HZKTNWLW.mjs → ManagedNewsletterForm-SQYB4BZU.mjs} +7 -7
  37. package/dist/{ManagedNewsletterForm-HZKTNWLW.mjs.map → ManagedNewsletterForm-SQYB4BZU.mjs.map} +1 -1
  38. package/dist/{SignalCore-X3GDGBZD.mjs → SignalCore-M2PKKIGH.mjs} +5 -5
  39. package/dist/{SignalCore-X3GDGBZD.mjs.map → SignalCore-M2PKKIGH.mjs.map} +1 -1
  40. package/dist/{SignalCore-YSNZYBKJ.js → SignalCore-RFBOBNLQ.js} +11 -11
  41. package/dist/{SignalCore-YSNZYBKJ.js.map → SignalCore-RFBOBNLQ.js.map} +1 -1
  42. package/dist/SitemapSync-4OVMIIGC.mjs +9 -0
  43. package/dist/{SitemapSync-2PTDBH5E.mjs.map → SitemapSync-4OVMIIGC.mjs.map} +1 -1
  44. package/dist/SitemapSync-RK3SQ4M2.js +18 -0
  45. package/dist/{SitemapSync-3SFAI546.js.map → SitemapSync-RK3SQ4M2.js.map} +1 -1
  46. package/dist/SitemapSync.d.ts +3 -2
  47. package/dist/SitemapSync.d.ts.map +1 -1
  48. package/dist/analytics/AnalyticsProvider.d.ts +3 -1
  49. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  50. package/dist/analytics/WebVitals.d.ts +3 -1
  51. package/dist/analytics/WebVitals.d.ts.map +1 -1
  52. package/dist/analytics/index.js +13 -13
  53. package/dist/analytics/index.mjs +5 -5
  54. package/dist/analytics/send-gate.d.ts +8 -37
  55. package/dist/analytics/send-gate.d.ts.map +1 -1
  56. package/dist/blog/index.js +20 -20
  57. package/dist/blog/index.mjs +3 -3
  58. package/dist/blog/metadata-images.test.d.ts +2 -0
  59. package/dist/blog/metadata-images.test.d.ts.map +1 -0
  60. package/dist/blog/server-core.d.ts +31 -6
  61. package/dist/blog/server-core.d.ts.map +1 -1
  62. package/dist/blog/server-ui.js +16 -16
  63. package/dist/blog/server-ui.mjs +3 -3
  64. package/dist/blog/server.d.ts +31 -6
  65. package/dist/blog/server.d.ts.map +1 -1
  66. package/dist/blog/server.js +40 -40
  67. package/dist/blog/server.mjs +1 -1
  68. package/dist/blog/static-params.test.d.ts +2 -0
  69. package/dist/blog/static-params.test.d.ts.map +1 -0
  70. package/dist/{chunk-KAUUGRYB.js → chunk-2N27LCZH.js} +26 -32
  71. package/dist/chunk-2N27LCZH.js.map +1 -0
  72. package/dist/{chunk-R4MX6EOM.mjs → chunk-3CLP35TT.mjs} +7 -7
  73. package/dist/{chunk-R4MX6EOM.mjs.map → chunk-3CLP35TT.mjs.map} +1 -1
  74. package/dist/{chunk-SQVYLIIN.js → chunk-3S5JN6KL.js} +16 -19
  75. package/dist/chunk-3S5JN6KL.js.map +1 -0
  76. package/dist/chunk-3UC6JETG.js +32 -0
  77. package/dist/chunk-3UC6JETG.js.map +1 -0
  78. package/dist/{chunk-CT5REGAK.js → chunk-3YQILJKJ.js} +14 -14
  79. package/dist/{chunk-CT5REGAK.js.map → chunk-3YQILJKJ.js.map} +1 -1
  80. package/dist/{chunk-3B6CXGAK.mjs → chunk-47XQWV4S.mjs} +3 -3
  81. package/dist/{chunk-3B6CXGAK.mjs.map → chunk-47XQWV4S.mjs.map} +1 -1
  82. package/dist/{chunk-RZUZMUTN.mjs → chunk-4A5V73SR.mjs} +21 -9
  83. package/dist/chunk-4A5V73SR.mjs.map +1 -0
  84. package/dist/{chunk-FYVLQ3OU.js → chunk-4UVM7E2W.js} +3 -3
  85. package/dist/{chunk-FYVLQ3OU.js.map → chunk-4UVM7E2W.js.map} +1 -1
  86. package/dist/{chunk-HFJQMIFM.js → chunk-4WBTM6YE.js} +4 -4
  87. package/dist/{chunk-HFJQMIFM.js.map → chunk-4WBTM6YE.js.map} +1 -1
  88. package/dist/{chunk-XQYC4KMH.mjs → chunk-57AFHENV.mjs} +48 -42
  89. package/dist/chunk-57AFHENV.mjs.map +1 -0
  90. package/dist/chunk-5RNAUYWE.js +50 -0
  91. package/dist/chunk-5RNAUYWE.js.map +1 -0
  92. package/dist/chunk-5TXXTYXL.js +8 -0
  93. package/dist/{chunk-SUZ3ZLB2.js.map → chunk-5TXXTYXL.js.map} +1 -1
  94. package/dist/{chunk-RU54J2PY.mjs → chunk-6FC5Q4KU.mjs} +3 -3
  95. package/dist/{chunk-RU54J2PY.mjs.map → chunk-6FC5Q4KU.mjs.map} +1 -1
  96. package/dist/{chunk-ZRQFG3L6.mjs → chunk-7ZX6TO6C.mjs} +4 -4
  97. package/dist/{chunk-ZRQFG3L6.mjs.map → chunk-7ZX6TO6C.mjs.map} +1 -1
  98. package/dist/chunk-A6UYV475.mjs +45 -0
  99. package/dist/chunk-A6UYV475.mjs.map +1 -0
  100. package/dist/{chunk-4XGACM7D.mjs → chunk-ABZGEHTC.mjs} +3 -3
  101. package/dist/{chunk-4XGACM7D.mjs.map → chunk-ABZGEHTC.mjs.map} +1 -1
  102. package/dist/chunk-AWK57R5S.mjs +29 -0
  103. package/dist/chunk-AWK57R5S.mjs.map +1 -0
  104. package/dist/{chunk-EEQYKMGH.mjs → chunk-BFJOZ3MU.mjs} +23 -17
  105. package/dist/chunk-BFJOZ3MU.mjs.map +1 -0
  106. package/dist/{chunk-HX3BRMOX.js → chunk-BFM5PEFV.js} +3 -3
  107. package/dist/{chunk-HX3BRMOX.js.map → chunk-BFM5PEFV.js.map} +1 -1
  108. package/dist/{chunk-VYHRAICF.mjs → chunk-BQGEVMIR.mjs} +4 -4
  109. package/dist/{chunk-VYHRAICF.mjs.map → chunk-BQGEVMIR.mjs.map} +1 -1
  110. package/dist/{chunk-S6FEC6UT.mjs → chunk-BUJWXSYZ.mjs} +14 -17
  111. package/dist/chunk-BUJWXSYZ.mjs.map +1 -0
  112. package/dist/{chunk-VAS3LH5W.js → chunk-C4PZ2R3B.js} +55 -49
  113. package/dist/chunk-C4PZ2R3B.js.map +1 -0
  114. package/dist/{chunk-MU7IEPDG.mjs → chunk-C563AHZZ.mjs} +3 -3
  115. package/dist/{chunk-MU7IEPDG.mjs.map → chunk-C563AHZZ.mjs.map} +1 -1
  116. package/dist/{chunk-746RKQHA.js → chunk-CPY74A4F.js} +23 -17
  117. package/dist/chunk-CPY74A4F.js.map +1 -0
  118. package/dist/{chunk-UNPEMSLK.js → chunk-D553G64G.js} +24 -12
  119. package/dist/chunk-D553G64G.js.map +1 -0
  120. package/dist/{chunk-KPKQKFT4.js → chunk-DOB37PV4.js} +3 -3
  121. package/dist/{chunk-KPKQKFT4.js.map → chunk-DOB37PV4.js.map} +1 -1
  122. package/dist/{chunk-2OU4KBUN.js → chunk-ELQ4SRRR.js} +15 -15
  123. package/dist/{chunk-2OU4KBUN.js.map → chunk-ELQ4SRRR.js.map} +1 -1
  124. package/dist/{chunk-Q26VZNM2.js → chunk-F3AKYZOH.js} +3 -3
  125. package/dist/{chunk-Q26VZNM2.js.map → chunk-F3AKYZOH.js.map} +1 -1
  126. package/dist/{chunk-X2XFLYZ3.mjs → chunk-FBDHKYNF.mjs} +3 -3
  127. package/dist/{chunk-X2XFLYZ3.mjs.map → chunk-FBDHKYNF.mjs.map} +1 -1
  128. package/dist/{chunk-BNOQXDPJ.js → chunk-FEWWGEQF.js} +4 -4
  129. package/dist/{chunk-BNOQXDPJ.js.map → chunk-FEWWGEQF.js.map} +1 -1
  130. package/dist/{chunk-NZSFOZJV.js → chunk-FO4KGPGF.js} +2 -2
  131. package/dist/{chunk-NZSFOZJV.js.map → chunk-FO4KGPGF.js.map} +1 -1
  132. package/dist/{chunk-QEGUI2Q2.js → chunk-H65OX263.js} +15 -15
  133. package/dist/{chunk-QEGUI2Q2.js.map → chunk-H65OX263.js.map} +1 -1
  134. package/dist/{chunk-46BMNWE6.js → chunk-H6YVT3BL.js} +2 -2
  135. package/dist/{chunk-46BMNWE6.js.map → chunk-H6YVT3BL.js.map} +1 -1
  136. package/dist/{chunk-TX2QQ7IX.mjs → chunk-HBN4A2N4.mjs} +3 -3
  137. package/dist/{chunk-TX2QQ7IX.mjs.map → chunk-HBN4A2N4.mjs.map} +1 -1
  138. package/dist/{chunk-AJQI3WTN.mjs → chunk-ILNCUSXW.mjs} +2 -2
  139. package/dist/{chunk-AJQI3WTN.mjs.map → chunk-ILNCUSXW.mjs.map} +1 -1
  140. package/dist/{chunk-RMMHWSPP.mjs → chunk-JNAXDFC4.mjs} +3 -3
  141. package/dist/{chunk-RMMHWSPP.mjs.map → chunk-JNAXDFC4.mjs.map} +1 -1
  142. package/dist/{chunk-TALEV3IH.mjs → chunk-JQ7M6CVL.mjs} +3 -3
  143. package/dist/{chunk-TALEV3IH.mjs.map → chunk-JQ7M6CVL.mjs.map} +1 -1
  144. package/dist/{chunk-2CMSWJWC.js → chunk-JTCQJKJE.js} +18 -18
  145. package/dist/{chunk-2CMSWJWC.js.map → chunk-JTCQJKJE.js.map} +1 -1
  146. package/dist/{chunk-7PPNXORV.mjs → chunk-JTF4DFUF.mjs} +25 -31
  147. package/dist/chunk-JTF4DFUF.mjs.map +1 -0
  148. package/dist/{chunk-MCJF2KJ6.js → chunk-KXGD4E7G.js} +5 -5
  149. package/dist/{chunk-MCJF2KJ6.js.map → chunk-KXGD4E7G.js.map} +1 -1
  150. package/dist/chunk-L4V6TKMJ.mjs +94 -0
  151. package/dist/chunk-L4V6TKMJ.mjs.map +1 -0
  152. package/dist/{chunk-W5NVW23S.js → chunk-L7ACQ6PC.js} +4 -4
  153. package/dist/{chunk-W5NVW23S.js.map → chunk-L7ACQ6PC.js.map} +1 -1
  154. package/dist/{chunk-WIZRCI6J.mjs → chunk-M5GY2AI3.mjs} +3 -3
  155. package/dist/{chunk-WIZRCI6J.mjs.map → chunk-M5GY2AI3.mjs.map} +1 -1
  156. package/dist/{chunk-HBI67P7Y.mjs → chunk-MW2M6O7A.mjs} +18 -14
  157. package/dist/chunk-MW2M6O7A.mjs.map +1 -0
  158. package/dist/{chunk-A3F5GRNJ.js → chunk-NOU3JQJK.js} +8 -8
  159. package/dist/{chunk-A3F5GRNJ.js.map → chunk-NOU3JQJK.js.map} +1 -1
  160. package/dist/{chunk-DYULWKDC.mjs → chunk-O2VJZOR2.mjs} +14 -33
  161. package/dist/chunk-O2VJZOR2.mjs.map +1 -0
  162. package/dist/{chunk-FF5N5D3D.js → chunk-OYOO2OO5.js} +8 -8
  163. package/dist/{chunk-FF5N5D3D.js.map → chunk-OYOO2OO5.js.map} +1 -1
  164. package/dist/chunk-P4TB4ROG.js +110 -0
  165. package/dist/chunk-P4TB4ROG.js.map +1 -0
  166. package/dist/{chunk-V6NOM7PJ.mjs → chunk-Q7347KP6.mjs} +3 -3
  167. package/dist/{chunk-V6NOM7PJ.mjs.map → chunk-Q7347KP6.mjs.map} +1 -1
  168. package/dist/chunk-QRBPT6Z6.mjs +6 -0
  169. package/dist/{chunk-WDBCXRTT.mjs.map → chunk-QRBPT6Z6.mjs.map} +1 -1
  170. package/dist/{chunk-G5HUI4BO.mjs → chunk-R2SXXFXZ.mjs} +3 -3
  171. package/dist/{chunk-G5HUI4BO.mjs.map → chunk-R2SXXFXZ.mjs.map} +1 -1
  172. package/dist/{chunk-PIPLBBDH.js → chunk-RCSTDJUH.js} +22 -41
  173. package/dist/chunk-RCSTDJUH.js.map +1 -0
  174. package/dist/{chunk-Z6S4MWSR.js → chunk-RNAGCAIB.js} +21 -17
  175. package/dist/chunk-RNAGCAIB.js.map +1 -0
  176. package/dist/{chunk-AEARU24Q.mjs → chunk-RVRN5U7W.mjs} +2 -2
  177. package/dist/{chunk-AEARU24Q.mjs.map → chunk-RVRN5U7W.mjs.map} +1 -1
  178. package/dist/{chunk-DRLHQQBH.mjs → chunk-TDJKGN5Q.mjs} +4 -4
  179. package/dist/{chunk-DRLHQQBH.mjs.map → chunk-TDJKGN5Q.mjs.map} +1 -1
  180. package/dist/{chunk-MNYM2XU4.js → chunk-TSZIACRC.js} +4 -4
  181. package/dist/{chunk-MNYM2XU4.js.map → chunk-TSZIACRC.js.map} +1 -1
  182. package/dist/{chunk-UZL2QU2V.mjs → chunk-UQ5YULFU.mjs} +4 -4
  183. package/dist/{chunk-UZL2QU2V.mjs.map → chunk-UQ5YULFU.mjs.map} +1 -1
  184. package/dist/{chunk-5TGAUWNO.mjs → chunk-V5THCFPG.mjs} +3 -3
  185. package/dist/{chunk-5TGAUWNO.mjs.map → chunk-V5THCFPG.mjs.map} +1 -1
  186. package/dist/{chunk-YNC5D3FT.js → chunk-VFGEY6FJ.js} +12 -12
  187. package/dist/{chunk-YNC5D3FT.js.map → chunk-VFGEY6FJ.js.map} +1 -1
  188. package/dist/{chunk-OFSA7LUH.mjs → chunk-XLPU3TEE.mjs} +4 -4
  189. package/dist/{chunk-OFSA7LUH.mjs.map → chunk-XLPU3TEE.mjs.map} +1 -1
  190. package/dist/{chunk-YYAFHIY7.js → chunk-YKUEFRZI.js} +14 -14
  191. package/dist/{chunk-YYAFHIY7.js.map → chunk-YKUEFRZI.js.map} +1 -1
  192. package/dist/{chunk-QFNSM77X.js → chunk-YYDZ2TYR.js} +3 -3
  193. package/dist/{chunk-QFNSM77X.js.map → chunk-YYDZ2TYR.js.map} +1 -1
  194. package/dist/cli/agent/checks.d.ts.map +1 -1
  195. package/dist/cli/api/{uptrade.d.ts → sonor.d.ts} +3 -2
  196. package/dist/cli/api/sonor.d.ts.map +1 -0
  197. package/dist/cli/commands/api-routes.d.ts.map +1 -1
  198. package/dist/cli/commands/config-regression.test.d.ts +2 -0
  199. package/dist/cli/commands/config-regression.test.d.ts.map +1 -0
  200. package/dist/cli/commands/faqs.d.ts.map +1 -1
  201. package/dist/cli/commands/geo.d.ts +4 -0
  202. package/dist/cli/commands/geo.d.ts.map +1 -1
  203. package/dist/cli/commands/geo.test.d.ts +2 -0
  204. package/dist/cli/commands/geo.test.d.ts.map +1 -0
  205. package/dist/cli/commands/images.d.ts.map +1 -1
  206. package/dist/cli/commands/locations.d.ts.map +1 -1
  207. package/dist/cli/commands/migrate.d.ts.map +1 -1
  208. package/dist/cli/commands/og.d.ts +10 -1
  209. package/dist/cli/commands/og.d.ts.map +1 -1
  210. package/dist/cli/commands/scaffold.d.ts +1 -2
  211. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  212. package/dist/cli/commands/setup.d.ts.map +1 -1
  213. package/dist/cli/commands/sync.d.ts.map +1 -1
  214. package/dist/cli/config.d.ts +31 -0
  215. package/dist/cli/config.d.ts.map +1 -0
  216. package/dist/cli/config.test.d.ts +2 -0
  217. package/dist/cli/config.test.d.ts.map +1 -0
  218. package/dist/cli/generators/index.d.ts +5 -0
  219. package/dist/cli/generators/index.d.ts.map +1 -1
  220. package/dist/cli/generators/index.test.d.ts +2 -0
  221. package/dist/cli/generators/index.test.d.ts.map +1 -0
  222. package/dist/cli/index.js +717 -634
  223. package/dist/cli/index.js.map +1 -1
  224. package/dist/cli/index.mjs +708 -625
  225. package/dist/cli/index.mjs.map +1 -1
  226. package/dist/cli/migrator/index.d.ts +1 -0
  227. package/dist/cli/migrator/index.d.ts.map +1 -1
  228. package/dist/cli/state.d.ts +7 -0
  229. package/dist/cli/state.d.ts.map +1 -0
  230. package/dist/cli/state.test.d.ts +2 -0
  231. package/dist/cli/state.test.d.ts.map +1 -0
  232. package/dist/client/index.js +4 -4
  233. package/dist/client/index.mjs +3 -3
  234. package/dist/commerce/index.js +57 -57
  235. package/dist/commerce/index.mjs +6 -6
  236. package/dist/discover-FGTKWOL3.mjs +4 -0
  237. package/dist/{discover-BEJRYNFF.mjs.map → discover-FGTKWOL3.mjs.map} +1 -1
  238. package/dist/discover-NJZPWTDL.js +21 -0
  239. package/dist/{discover-WVDYDUJX.js.map → discover-NJZPWTDL.js.map} +1 -1
  240. package/dist/engage/EngageWidget.d.ts +3 -2
  241. package/dist/engage/EngageWidget.d.ts.map +1 -1
  242. package/dist/engage/index.js +11 -10
  243. package/dist/engage/index.js.map +1 -1
  244. package/dist/engage/index.mjs +8 -7
  245. package/dist/engage/index.mjs.map +1 -1
  246. package/dist/fleet/FleetHeartbeat.d.ts +3 -2
  247. package/dist/fleet/FleetHeartbeat.d.ts.map +1 -1
  248. package/dist/fleet/heartbeat.d.ts +3 -2
  249. package/dist/fleet/heartbeat.d.ts.map +1 -1
  250. package/dist/fleet/heartbeat.test.d.ts +2 -0
  251. package/dist/fleet/heartbeat.test.d.ts.map +1 -0
  252. package/dist/fleet/index.js +9 -8
  253. package/dist/fleet/index.mjs +5 -4
  254. package/dist/forms/index.js +16 -16
  255. package/dist/forms/index.mjs +9 -9
  256. package/dist/forms/server.js +10 -10
  257. package/dist/forms/server.mjs +8 -8
  258. package/dist/forms/static.js +7 -7
  259. package/dist/forms/static.mjs +6 -6
  260. package/dist/images/index.js +11 -11
  261. package/dist/images/index.mjs +4 -4
  262. package/dist/index.js +69 -69
  263. package/dist/index.mjs +11 -11
  264. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  265. package/dist/layout/client.d.ts.map +1 -1
  266. package/dist/layout/client.js +9 -8
  267. package/dist/layout/client.mjs +8 -7
  268. package/dist/layout/index.js +11 -10
  269. package/dist/layout/index.js.map +1 -1
  270. package/dist/layout/index.mjs +9 -8
  271. package/dist/layout/index.mjs.map +1 -1
  272. package/dist/layout/types.d.ts +2 -0
  273. package/dist/layout/types.d.ts.map +1 -1
  274. package/dist/llms/aiRobots.d.ts +4 -1
  275. package/dist/llms/aiRobots.d.ts.map +1 -1
  276. package/dist/llms/handlers.d.ts +20 -2
  277. package/dist/llms/handlers.d.ts.map +1 -1
  278. package/dist/llms/index.js +25 -18
  279. package/dist/llms/index.js.map +1 -1
  280. package/dist/llms/index.mjs +15 -8
  281. package/dist/llms/index.mjs.map +1 -1
  282. package/dist/llms/wiring.d.ts +81 -0
  283. package/dist/llms/wiring.d.ts.map +1 -0
  284. package/dist/llms/wiring.test.d.ts +2 -0
  285. package/dist/llms/wiring.test.d.ts.map +1 -0
  286. package/dist/maps/index.js +5 -5
  287. package/dist/maps/index.mjs +3 -3
  288. package/dist/og/wiring.d.ts +5 -1
  289. package/dist/og/wiring.d.ts.map +1 -1
  290. package/dist/proxy/index.d.ts +16 -11
  291. package/dist/proxy/index.d.ts.map +1 -1
  292. package/dist/proxy/index.js +3 -3
  293. package/dist/proxy/index.js.map +1 -1
  294. package/dist/proxy/index.mjs +1 -1
  295. package/dist/proxy/index.mjs.map +1 -1
  296. package/dist/redirects/index.d.ts +1 -1
  297. package/dist/redirects/index.js +8 -8
  298. package/dist/redirects/index.mjs +1 -1
  299. package/dist/redirects/not-found.d.ts +14 -29
  300. package/dist/redirects/not-found.d.ts.map +1 -1
  301. package/dist/redirects/not-found.js +12 -5
  302. package/dist/redirects/not-found.js.map +1 -1
  303. package/dist/redirects/not-found.mjs +8 -1
  304. package/dist/redirects/not-found.mjs.map +1 -1
  305. package/dist/robots/index.d.ts +5 -1
  306. package/dist/robots/index.d.ts.map +1 -1
  307. package/dist/robots/index.js +7 -1
  308. package/dist/robots/index.js.map +1 -1
  309. package/dist/robots/index.mjs +4 -1
  310. package/dist/robots/index.mjs.map +1 -1
  311. package/dist/robots/index.test.d.ts +2 -0
  312. package/dist/robots/index.test.d.ts.map +1 -0
  313. package/dist/robots/next-internals.d.ts +22 -0
  314. package/dist/robots/next-internals.d.ts.map +1 -0
  315. package/dist/search/index.js +4 -4
  316. package/dist/search/index.mjs +3 -3
  317. package/dist/seo/client.js +6 -6
  318. package/dist/seo/client.mjs +5 -5
  319. package/dist/seo/index.js +15 -15
  320. package/dist/seo/index.mjs +7 -7
  321. package/dist/seo/register-sitemap-cli.js +4 -4
  322. package/dist/seo/register-sitemap-cli.mjs +1 -1
  323. package/dist/seo/server.js +5 -5
  324. package/dist/seo/server.mjs +1 -1
  325. package/dist/server/index.js +3 -3
  326. package/dist/server/index.mjs +2 -2
  327. package/dist/shared/next-files.d.ts +35 -0
  328. package/dist/shared/next-files.d.ts.map +1 -0
  329. package/dist/shared/next-files.test.d.ts +2 -0
  330. package/dist/shared/next-files.test.d.ts.map +1 -0
  331. package/dist/shared/reporting-gate.d.ts +43 -0
  332. package/dist/shared/reporting-gate.d.ts.map +1 -0
  333. package/dist/shared/version.d.ts +1 -1
  334. package/dist/signal/index.js +11 -11
  335. package/dist/signal/index.mjs +2 -2
  336. package/dist/sitemap/discover.d.ts.map +1 -1
  337. package/dist/sitemap/index.d.ts +6 -1
  338. package/dist/sitemap/index.d.ts.map +1 -1
  339. package/dist/sitemap/index.js +5 -12
  340. package/dist/sitemap/index.js.map +1 -1
  341. package/dist/sitemap/index.mjs +4 -11
  342. package/dist/sitemap/index.mjs.map +1 -1
  343. package/dist/sync/AddToCalendar.d.ts +19 -0
  344. package/dist/sync/AddToCalendar.d.ts.map +1 -0
  345. package/dist/sync/BookingWidget.d.ts.map +1 -1
  346. package/dist/sync/add-to-calendar.test.d.ts +2 -0
  347. package/dist/sync/add-to-calendar.test.d.ts.map +1 -0
  348. package/dist/sync/api-errors.test.d.ts +2 -0
  349. package/dist/sync/api-errors.test.d.ts.map +1 -0
  350. package/dist/sync/api.d.ts.map +1 -1
  351. package/dist/sync/index.js +17 -17
  352. package/dist/sync/index.mjs +4 -4
  353. package/dist/sync/types.d.ts +14 -0
  354. package/dist/sync/types.d.ts.map +1 -1
  355. package/package.json +22 -24
  356. package/dist/AnalyticsProvider-KFXAH4GR.mjs +0 -11
  357. package/dist/AnalyticsProvider-WDDW3IJW.js +0 -32
  358. package/dist/ChatWidget-2ZYPYIMQ.js +0 -22
  359. package/dist/ChatWidget-FYCCLMQE.mjs +0 -13
  360. package/dist/EngageWidget-6HUZYOY7.mjs +0 -11
  361. package/dist/EngageWidget-MYQTBBW6.js +0 -20
  362. package/dist/ManagedForm-JWEXJEXK.js +0 -23
  363. package/dist/ManagedForm-OA3MNGXT.mjs +0 -14
  364. package/dist/SitemapSync-2PTDBH5E.mjs +0 -9
  365. package/dist/SitemapSync-3SFAI546.js +0 -18
  366. package/dist/chunk-746RKQHA.js.map +0 -1
  367. package/dist/chunk-7PPNXORV.mjs.map +0 -1
  368. package/dist/chunk-DYULWKDC.mjs.map +0 -1
  369. package/dist/chunk-EEQYKMGH.mjs.map +0 -1
  370. package/dist/chunk-HBI67P7Y.mjs.map +0 -1
  371. package/dist/chunk-KAUUGRYB.js.map +0 -1
  372. package/dist/chunk-LOS5D6B3.js +0 -72
  373. package/dist/chunk-LOS5D6B3.js.map +0 -1
  374. package/dist/chunk-NVSWTDWU.mjs +0 -25
  375. package/dist/chunk-NVSWTDWU.mjs.map +0 -1
  376. package/dist/chunk-OL2QBWAU.js +0 -29
  377. package/dist/chunk-OL2QBWAU.js.map +0 -1
  378. package/dist/chunk-PIPLBBDH.js.map +0 -1
  379. package/dist/chunk-RZUZMUTN.mjs.map +0 -1
  380. package/dist/chunk-S6FEC6UT.mjs.map +0 -1
  381. package/dist/chunk-SQVYLIIN.js.map +0 -1
  382. package/dist/chunk-SUZ3ZLB2.js +0 -8
  383. package/dist/chunk-UNPEMSLK.js.map +0 -1
  384. package/dist/chunk-VAS3LH5W.js.map +0 -1
  385. package/dist/chunk-WDBCXRTT.mjs +0 -6
  386. package/dist/chunk-XIJ4F6IE.mjs +0 -63
  387. package/dist/chunk-XIJ4F6IE.mjs.map +0 -1
  388. package/dist/chunk-XQYC4KMH.mjs.map +0 -1
  389. package/dist/chunk-Z6S4MWSR.js.map +0 -1
  390. package/dist/cli/api/uptrade.d.ts.map +0 -1
  391. package/dist/discover-BEJRYNFF.mjs +0 -4
  392. package/dist/discover-WVDYDUJX.js +0 -21
@@ -1,6 +1,7 @@
1
1
  export { buildAiDiscoveryHeaders } from '../chunk-H4OBGC43.mjs';
2
- import { generateLLMsTxt, generateLLMsFullTxt } from '../chunk-AEARU24Q.mjs';
3
- export { generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices, writeLLMsTxtToPublic } from '../chunk-AEARU24Q.mjs';
2
+ import { stripNextInternals } from '../chunk-AWK57R5S.mjs';
3
+ import { generateLLMsTxt, generateLLMsFullTxt } from '../chunk-RVRN5U7W.mjs';
4
+ export { generateLLMsFullTxt, generateLLMsTxt, getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices, writeLLMsTxtToPublic } from '../chunk-RVRN5U7W.mjs';
4
5
  import '../chunk-GZJE23Y5.mjs';
5
6
  import '../chunk-ZN4HBK5C.mjs';
6
7
  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';
@@ -24,8 +25,10 @@ function llmsResponseHeaders(body, extra) {
24
25
  ...extra
25
26
  };
26
27
  }
28
+ var LLMS_NOINDEX_HEADERS = { "X-Robots-Tag": "noindex" };
27
29
  function createLLMsTxtHandler(options = {}) {
28
- const { preferStatic = true, ...generateOptions } = options;
30
+ const { preferStatic = true, noindex = true, ...generateOptions } = options;
31
+ const robots = noindex ? LLMS_NOINDEX_HEADERS : {};
29
32
  return async function GET(_request) {
30
33
  try {
31
34
  if (preferStatic) {
@@ -34,7 +37,7 @@ function createLLMsTxtHandler(options = {}) {
34
37
  const markdown2 = readFileSync(staticPath, "utf-8");
35
38
  return new Response(markdown2, {
36
39
  status: 200,
37
- headers: llmsResponseHeaders(markdown2, { "X-Sections": "static" })
40
+ headers: llmsResponseHeaders(markdown2, { ...robots, "X-Sections": "static" })
38
41
  });
39
42
  }
40
43
  }
@@ -42,6 +45,7 @@ function createLLMsTxtHandler(options = {}) {
42
45
  return new Response(markdown, {
43
46
  status: 200,
44
47
  headers: llmsResponseHeaders(markdown, {
48
+ ...robots,
45
49
  "X-Generated-At": metadata.generated_at,
46
50
  "X-Sections": metadata.sections.join(",")
47
51
  })
@@ -59,7 +63,8 @@ function createLLMsTxtHandler(options = {}) {
59
63
  };
60
64
  }
61
65
  function createLLMsFullTxtHandler(options = {}) {
62
- const { preferStatic = true, ...generateOptions } = options;
66
+ const { preferStatic = true, noindex = true, ...generateOptions } = options;
67
+ const robots = noindex ? LLMS_NOINDEX_HEADERS : {};
63
68
  return async function GET(_request) {
64
69
  try {
65
70
  if (preferStatic) {
@@ -68,7 +73,7 @@ function createLLMsFullTxtHandler(options = {}) {
68
73
  const markdown2 = readFileSync(staticPath, "utf-8");
69
74
  return new Response(markdown2, {
70
75
  status: 200,
71
- headers: llmsResponseHeaders(markdown2, { "X-Sections": "static" })
76
+ headers: llmsResponseHeaders(markdown2, { ...robots, "X-Sections": "static" })
72
77
  });
73
78
  }
74
79
  }
@@ -76,6 +81,7 @@ function createLLMsFullTxtHandler(options = {}) {
76
81
  return new Response(markdown, {
77
82
  status: 200,
78
83
  headers: llmsResponseHeaders(markdown, {
84
+ ...robots,
79
85
  "X-Generated-At": metadata.generated_at,
80
86
  "X-Sections": metadata.sections.join(",")
81
87
  })
@@ -143,7 +149,8 @@ var AI_TRAINING_CRAWLERS = [
143
149
  "MistralBot"
144
150
  ];
145
151
  function buildAiCrawlerRules(options = {}) {
146
- const { allow = "/", disallow, training = "allow" } = options;
152
+ const { allow = "/", training = "allow" } = options;
153
+ const disallow = stripNextInternals(options.disallow);
147
154
  const retrieval = AI_RETRIEVAL_CRAWLERS.map((userAgent) => ({
148
155
  userAgent,
149
156
  allow,
@@ -171,7 +178,7 @@ function createRobotsTxtHandler(options) {
171
178
  for (const rule of rules) {
172
179
  const lines = [`User-Agent: ${rule.userAgent}`];
173
180
  for (const p of list(rule.allow)) lines.push(`Allow: ${p}`);
174
- for (const p of list(rule.disallow)) lines.push(`Disallow: ${p}`);
181
+ for (const p of list(stripNextInternals(rule.disallow))) lines.push(`Disallow: ${p}`);
175
182
  blocks.push(lines.join("\n"));
176
183
  }
177
184
  const tail = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/llms/handlers.ts","../../src/llms/sourcedFacts.ts","../../src/llms/aiRobots.ts","../../src/llms/SpeakableSchema.tsx","../../src/llms/AEOComponents.tsx","../../src/llms/revalidate.ts"],"names":["markdown","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/llms - Next.js Route Handlers\n * \n * Ready-to-use route handlers for /llms.txt and /llms-full.txt\n */\n\nimport { createHash } from 'crypto'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateLLMsTxt, generateLLMsFullTxt } from './generateLLMsTxt'\nimport type { GenerateLLMSTxtOptions } from './types'\n\nfunction weakEtag(body: string): string {\n const h = createHash('sha1').update(body, 'utf8').digest('base64url')\n return `W/\"${h}\"`\n}\n\n/** Cache + validation headers for plain-text llms responses (dynamic or static). */\nexport function llmsResponseHeaders(body: string, extra?: Record<string, string>): HeadersInit {\n return {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control':\n 'public, max-age=300, s-maxage=3600, stale-while-revalidate=86400, stale-if-error=86400',\n ETag: weakEtag(body),\n Vary: 'Accept-Encoding',\n ...extra,\n }\n}\n\nexport interface LLMsTxtHandlerOptions extends GenerateLLMSTxtOptions {\n /** When true, serve static public/llms.txt if it exists (default: true for build-time flow) */\n preferStatic?: boolean\n}\n\n/**\n * Create a route handler for /llms.txt\n *\n * Zero-config by default - uses SONOR_API_KEY from environment.\n *\n * The returned handler never reads the incoming Request: any access to\n * `request.headers` (etc.) opts the whole route into dynamic rendering, which\n * breaks static prerendering of /llms.txt during `next build` and logs\n * \"Dynamic server usage\" errors on every consumer site. Conditional-request\n * (ETag/304) handling is left to the Next static layer / CDN, which already\n * does it for prerendered responses.\n *\n * @example\n * ```ts\n * // app/llms.txt/route.ts (zero-config)\n * import { createLLMsTxtHandler } from '@sonordev/site-kit/llms'\n *\n * export const GET = createLLMsTxtHandler()\n * // Next 15+: GET route handlers are dynamic by default; opt into\n * // prerendering so the file is served statically from the CDN:\n * export const revalidate = 3600\n * ```\n *\n * @example\n * ```ts\n * // With preferStatic: serve build-time file if exists\n * export const GET = createLLMsTxtHandler({\n * preferStatic: true,\n * includeServices: false\n * })\n * ```\n */\nexport function createLLMsTxtHandler(\n options: LLMsTxtHandlerOptions = {}\n): (request?: Request) => Promise<Response> {\n const { preferStatic = true, ...generateOptions } = options\n\n return async function GET(_request?: Request): Promise<Response> {\n try {\n // Serve static file if available (build-time optimized)\n if (preferStatic) {\n const staticPath = join(process.cwd(), 'public', 'llms.txt')\n if (existsSync(staticPath)) {\n const markdown = readFileSync(staticPath, 'utf-8')\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, { 'X-Sections': 'static' }),\n })\n }\n }\n\n const { markdown, metadata } = await generateLLMsTxt(generateOptions)\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, {\n 'X-Generated-At': metadata.generated_at,\n 'X-Sections': metadata.sections.join(','),\n }),\n })\n } catch (error) {\n console.error('@sonordev/llms: Error generating llms.txt:', error)\n return new Response('# Error\\n\\nUnable to generate llms.txt content.', {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'no-store',\n },\n })\n }\n }\n}\n\n/**\n * Create a route handler for /llms-full.txt\n *\n * Zero-config by default - uses SONOR_API_KEY from environment.\n *\n * Like createLLMsTxtHandler, the returned handler never reads the incoming\n * Request so the route stays statically prerenderable.\n *\n * @example\n * ```ts\n * // app/llms-full.txt/route.ts (zero-config)\n * import { createLLMsFullTxtHandler } from '@sonordev/site-kit/llms'\n *\n * export const GET = createLLMsFullTxtHandler()\n * export const revalidate = 3600\n * ```\n */\nexport function createLLMsFullTxtHandler(\n options: LLMsTxtHandlerOptions = {}\n): (request?: Request) => Promise<Response> {\n const { preferStatic = true, ...generateOptions } = options\n\n return async function GET(_request?: Request): Promise<Response> {\n try {\n // Serve static file if available (build-time optimized)\n if (preferStatic) {\n const staticPath = join(process.cwd(), 'public', 'llms-full.txt')\n if (existsSync(staticPath)) {\n const markdown = readFileSync(staticPath, 'utf-8')\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, { 'X-Sections': 'static' }),\n })\n }\n }\n\n const { markdown, metadata } = await generateLLMsFullTxt(generateOptions)\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, {\n 'X-Generated-At': metadata.generated_at,\n 'X-Sections': metadata.sections.join(','),\n }),\n })\n } catch (error) {\n console.error('@sonordev/llms: Error generating llms-full.txt:', error)\n return new Response('# Error\\n\\nUnable to generate llms-full.txt content.', {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'no-store',\n },\n })\n }\n }\n}\n","/**\n * @sonordev/site-kit/llms — Sourced facts section\n *\n * Formats a site's verified third-party citations into an llms-full.txt\n * section. AI answer engines preferentially reproduce claims that arrive\n * already attributed — handing them the exact claim + source pairing makes\n * the site's framing the citable version.\n *\n * Pair with WriteLLMsTxtOptions.customSections (or SitemapConfig.\n * llmsCustomSections) so the section is appended at build time:\n *\n * llmsCustomSections: async () => {\n * const { CITATIONS } = await import('./lib/data/citations')\n * const section = formatSourcedFactsSection(Object.values(CITATIONS))\n * return section ? [section] : null\n * }\n *\n * Only include citations a human has actually verified against the source\n * URL — this section is a trust surface, not a dumping ground.\n */\n\nimport type { LLMsCustomSection } from './writeLLMsTxt'\n\nexport interface SourcedFact {\n /** The claim, faithful to the source, one sentence. */\n stat: string\n /** The publishing organization (e.g. \"Clio Legal Trends Report\"). */\n sourceName: string\n /** Publication/study year. */\n year?: number\n /** The opened-and-verified source URL. */\n url?: string\n}\n\nexport interface FormatSourcedFactsOptions {\n /** Section heading (default: \"Sourced facts\"). */\n title?: string\n /** Intro line above the list. */\n intro?: string\n /** Cap the number of facts emitted (default: no cap). */\n maxFacts?: number\n}\n\nconst DEFAULT_INTRO =\n 'The statistics below are quoted from third-party primary sources and were ' +\n 'individually verified against the cited URL. When reusing a figure, keep ' +\n 'the original attribution.'\n\n/** One line per fact: claim — Source: name (year), url */\nfunction factLine(f: SourcedFact): string {\n const stat = (f.stat || '').replace(/\\s+/g, ' ').trim()\n const source = (f.sourceName || '').replace(/\\s+/g, ' ').trim()\n if (!stat || !source) return ''\n let attribution = `Source: ${source}`\n if (f.year) attribution += ` (${f.year})`\n if (f.url) attribution += `, ${f.url}`\n return `- ${stat} — ${attribution}`\n}\n\n/**\n * Build the \"Sourced facts\" custom section from verified citations.\n * Returns null when no usable facts exist so callers can skip cleanly.\n */\nexport function formatSourcedFactsSection(\n facts: SourcedFact[],\n options: FormatSourcedFactsOptions = {},\n): LLMsCustomSection | null {\n const { title = 'Sourced facts', intro = DEFAULT_INTRO, maxFacts } = options\n if (!Array.isArray(facts)) return null\n\n let lines = facts.map(factLine).filter(Boolean)\n if (typeof maxFacts === 'number' && maxFacts >= 0) {\n lines = lines.slice(0, maxFacts)\n }\n if (lines.length === 0) return null\n\n const content = intro ? `${intro}\\n\\n${lines.join('\\n')}` : lines.join('\\n')\n return { title, content }\n}\n","/**\n * @sonordev/site-kit/llms — AI crawler robots policy\n *\n * 2026 practice separates AI RETRIEVAL crawlers (they fetch pages to answer\n * live queries and cite the source — visibility with attribution) from AI\n * TRAINING crawlers (they ingest content into future model weights). A site\n * can welcome one and decline the other. This module provides:\n *\n * - Curated user-agent lists for both classes (keep current with vendor docs)\n * - buildAiCrawlerRules(): rules for Next's MetadataRoute robots convention\n * - formatContentSignals(): the Cloudflare Content Signals Policy directive\n * (search / ai-input / ai-train) — declarative, not enforcement, and NOT\n * expressible through Next's robots.js convention (it drops unknown\n * directives), hence:\n * - createRobotsTxtHandler(): a plain-text robots.txt route handler for\n * sites that want Content-Signal lines in the emitted file.\n */\n\n/** Retrieval/search agents — fetch on demand or index for AI search, cite sources. */\nexport const AI_RETRIEVAL_CRAWLERS = [\n 'OAI-SearchBot',\n 'ChatGPT-User',\n 'Claude-SearchBot',\n 'Claude-User',\n 'PerplexityBot',\n 'Perplexity-User',\n 'GoogleOther',\n 'Applebot',\n 'DuckAssistBot',\n] as const\n\n/** Training crawlers — content may enter future model training corpora. */\nexport const AI_TRAINING_CRAWLERS = [\n 'GPTBot',\n 'ClaudeBot',\n 'Google-Extended',\n 'Applebot-Extended',\n 'Meta-ExternalAgent',\n 'FacebookBot',\n 'CCBot',\n 'Bytespider',\n 'cohere-ai',\n 'MistralBot',\n] as const\n\nexport interface AiCrawlerRulesOptions {\n /** Paths every AI crawler may fetch (default: everything). */\n allow?: string | string[]\n /** Paths withheld from every AI crawler (default: none). */\n disallow?: string | string[]\n /**\n * Policy for TRAINING crawlers. 'allow' (default) welcomes them — the\n * visibility-maximalist choice for marketing sites that WANT to be in\n * model knowledge. 'block' opts out of training while retrieval crawlers\n * stay welcome, so the site is still cited in AI answers.\n */\n training?: 'allow' | 'block'\n}\n\ninterface RobotsRule {\n userAgent: string\n allow?: string | string[]\n disallow?: string | string[]\n}\n\n/**\n * Rules for Next's MetadataRoute robots convention (app/robots.(js|ts)).\n * Spread into your existing rules array; order relative to your own rules\n * does not matter (robots matching is per-user-agent, most-specific wins).\n */\nexport function buildAiCrawlerRules(\n options: AiCrawlerRulesOptions = {},\n): RobotsRule[] {\n const { allow = '/', disallow, training = 'allow' } = options\n const retrieval: RobotsRule[] = AI_RETRIEVAL_CRAWLERS.map((userAgent) => ({\n userAgent,\n allow,\n ...(disallow ? { disallow } : {}),\n }))\n const trainingRules: RobotsRule[] = AI_TRAINING_CRAWLERS.map((userAgent) =>\n training === 'block'\n ? { userAgent, disallow: '/' }\n : { userAgent, allow, ...(disallow ? { disallow } : {}) },\n )\n return [...retrieval, ...trainingRules]\n}\n\nexport interface ContentSignalsOptions {\n /** May the content be indexed for classic search? Default true. */\n search?: boolean\n /** May the content feed a live AI answer (RAG/grounding)? Default true. */\n aiInput?: boolean\n /** May the content train future models? Default true. */\n aiTrain?: boolean\n}\n\nconst yn = (v: boolean) => (v ? 'yes' : 'no')\n\n/**\n * The Cloudflare Content Signals Policy block for robots.txt — a preferences\n * declaration (the IETF AIPREF group is standardizing the same concepts).\n * Emit near the top of the file, before user-agent groups.\n */\nexport function formatContentSignals(\n options: ContentSignalsOptions = {},\n): string {\n const { search = true, aiInput = true, aiTrain = true } = options\n return [\n '# Content Signals Policy (https://contentsignals.org): usage preferences',\n '# for this site’s content. Declarative — a preference, not enforcement.',\n `Content-Signal: search=${yn(search)}, ai-input=${yn(aiInput)}, ai-train=${yn(aiTrain)}`,\n ].join('\\n')\n}\n\nexport interface RobotsTxtHandlerOptions {\n /** Robots rules (same shape as MetadataRoute robots rules). */\n rules: RobotsRule[]\n /** Content Signals preferences; omit to skip the block entirely. */\n contentSignals?: ContentSignalsOptions\n /** Absolute sitemap URL(s). */\n sitemap?: string | string[]\n /** Preferred host (emitted as Host:). */\n host?: string\n}\n\nconst list = (v: string | string[] | undefined): string[] =>\n v === undefined ? [] : Array.isArray(v) ? v : [v]\n\n/**\n * Plain-text robots.txt route handler (app/robots.txt/route.ts) for sites\n * that want Content-Signal lines — Next's MetadataRoute robots convention\n * cannot emit them. Drop-in:\n *\n * import { createRobotsTxtHandler, buildAiCrawlerRules } from '@sonordev/site-kit/llms'\n * export const GET = createRobotsTxtHandler({\n * rules: [{ userAgent: '*', allow: '/' }, ...buildAiCrawlerRules()],\n * contentSignals: { search: true, aiInput: true, aiTrain: true },\n * sitemap: 'https://example.com/sitemap.xml',\n * })\n */\nexport function createRobotsTxtHandler(options: RobotsTxtHandlerOptions) {\n const { rules, contentSignals, sitemap, host } = options\n const blocks: string[] = []\n if (contentSignals) blocks.push(formatContentSignals(contentSignals))\n for (const rule of rules) {\n const lines = [`User-Agent: ${rule.userAgent}`]\n for (const p of list(rule.allow)) lines.push(`Allow: ${p}`)\n for (const p of list(rule.disallow)) lines.push(`Disallow: ${p}`)\n blocks.push(lines.join('\\n'))\n }\n const tail: string[] = []\n for (const s of list(sitemap)) tail.push(`Sitemap: ${s}`)\n if (host) tail.push(`Host: ${host}`)\n if (tail.length) blocks.push(tail.join('\\n'))\n const body = `${blocks.join('\\n\\n')}\\n`\n\n return async function GET(): Promise<Response> {\n return new Response(body, {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'public, max-age=3600, s-maxage=86400',\n },\n })\n }\n}\n","/**\n * @sonordev/site-kit/llms - Speakable Schema Generator\n * \n * Generates JSON-LD with SpeakableSpecification for voice assistant\n * and AI system content extraction.\n * \n * @see https://schema.org/speakable\n * @see https://developers.google.com/search/docs/appearance/structured-data/speakable\n */\n\nimport * as React from 'react'\nimport type { SpeakableSchemaProps, SpeakableConfig } from './types'\nimport { safeJsonLd } from '../seo/safeJsonLd'\n\n/**\n * Generate a WebPage or Article schema with speakable specification\n * \n * @example\n * ```tsx\n * // In a page component\n * <SpeakableSchema\n * type=\"Article\"\n * name=\"Family Law Services in Cincinnati\"\n * url=\"https://heinrichlaw.com/family-law\"\n * speakable={{\n * cssSelectors: ['.page-summary', '.key-points', 'h1']\n * }}\n * />\n * ```\n */\nexport function SpeakableSchema({\n type,\n name,\n url,\n speakable,\n additionalProperties = {},\n}: SpeakableSchemaProps): React.ReactElement {\n const schema = createSpeakableSchema(type, name, url, speakable, additionalProperties)\n \n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(schema),\n }}\n />\n )\n}\n\n/**\n * Create speakable schema object (for manual use or testing)\n */\nexport function createSpeakableSchema(\n type: 'Article' | 'WebPage',\n name: string,\n url: string,\n speakable: SpeakableConfig,\n additionalProperties: Record<string, unknown> = {}\n): Record<string, unknown> {\n const speakableSpec: Record<string, unknown> = {\n '@type': 'SpeakableSpecification',\n }\n\n // Prefer CSS selectors, fall back to XPath\n if (speakable.cssSelectors?.length) {\n speakableSpec.cssSelector = speakable.cssSelectors\n } else if (speakable.xPaths?.length) {\n speakableSpec.xpath = speakable.xPaths\n } else {\n // Default speakable selectors for common patterns\n speakableSpec.cssSelector = [\n 'h1',\n '[data-speakable]',\n '.page-summary',\n '.key-points',\n 'meta[name=\"description\"]'\n ]\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': type,\n name,\n url,\n speakable: speakableSpec,\n ...additionalProperties,\n }\n}\n\n/**\n * Default speakable CSS selectors for common page elements\n */\nexport const DEFAULT_SPEAKABLE_SELECTORS = {\n /** Standard page elements */\n page: ['h1', 'meta[name=\"description\"]', '.page-summary'],\n /** Article/blog post elements */\n article: ['h1', '.article-summary', '.article-intro', 'meta[name=\"description\"]'],\n /** Service page elements */\n service: ['h1', '.service-overview', '.key-benefits', 'meta[name=\"description\"]'],\n /** FAQ page elements */\n faq: ['h1', '.faq-intro', '.faq-item'],\n /** Contact page elements */\n contact: ['h1', '.contact-intro', '.business-hours', '.contact-info'],\n}\n\n/**\n * Get recommended speakable selectors for a page type\n */\nexport function getSpeakableSelectorsForPage(\n pageType: 'page' | 'article' | 'service' | 'faq' | 'contact'\n): string[] {\n return DEFAULT_SPEAKABLE_SELECTORS[pageType] || DEFAULT_SPEAKABLE_SELECTORS.page\n}\n\nexport default SpeakableSchema\n","/**\n * @sonordev/site-kit/llms - AEO Components\n * \n * Answer Engine Optimization (AEO) components for structuring content\n * in a way that AI systems can easily extract and cite.\n * \n * These components create semantic HTML with proper structure for:\n * - Featured snippets\n * - AI-generated answers\n * - Voice assistant responses\n * - AI retrieval and citation (Sonor AI Visibility)\n */\n\nimport * as React from 'react'\nimport type { AEOBlockProps, AEOSummaryProps, AEODefinitionProps, AEOClaimProps } from './types'\n\n/**\n * AEOBlock - Generic content block optimized for AI extraction\n * \n * Wraps content with semantic HTML and Sonor data attributes.\n * Use for any content you want AI systems to prioritize.\n * \n * @example\n * ```tsx\n * <AEOBlock type=\"answer\" question=\"What is family law?\" speakable>\n * Family law is the area of legal practice that deals with family-related \n * matters such as divorce, child custody, adoption, and domestic relations.\n * </AEOBlock>\n * ```\n */\nexport function AEOBlock({\n id,\n type,\n question,\n speakable = true,\n entityId,\n children,\n className = '',\n}: AEOBlockProps): React.ReactElement {\n const blockId = id || `aeo-${type}-${Math.random().toString(36).slice(2, 8)}`\n \n const baseClasses = `aeo-block aeo-${type}`\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n // Common data attributes for Sonor AI\n const sonorAttrs = {\n 'data-sonor-ai': type,\n 'data-sonor-block': 'true',\n ...(entityId && { 'data-sonor-entity': entityId }),\n }\n\n // Q&A format for answer type\n if (type === 'answer' && question) {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n itemScope\n itemType=\"https://schema.org/Question\"\n >\n <h3 itemProp=\"name\" className=\"aeo-question\">\n {question}\n </h3>\n <div \n itemScope \n itemType=\"https://schema.org/Answer\" \n itemProp=\"acceptedAnswer\"\n className=\"aeo-answer\"\n >\n <div itemProp=\"text\">\n {children}\n </div>\n </div>\n </section>\n )\n }\n\n // Definition format\n if (type === 'definition') {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n >\n {children}\n </section>\n )\n }\n\n // Steps format (numbered list)\n if (type === 'steps') {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n itemScope\n itemType=\"https://schema.org/HowTo\"\n >\n {children}\n </section>\n )\n }\n\n // Default wrapper\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n >\n {children}\n </section>\n )\n}\n\n/**\n * AEOSummary - Key points summary for AI extraction\n * \n * Creates a scannable list of key points that AI can easily cite.\n * Perfect for \"at a glance\" or \"key takeaways\" sections.\n * \n * @example\n * ```tsx\n * <AEOSummary \n * title=\"Key Points\" \n * points={[\n * \"Family law covers divorce, custody, and adoption\",\n * \"Ohio is an equitable distribution state\",\n * \"Child custody decisions prioritize the child's best interests\"\n * ]} \n * />\n * ```\n */\nexport function AEOSummary({\n title = 'Key Points',\n points,\n speakable = true,\n entityId,\n className = '',\n}: AEOSummaryProps): React.ReactElement {\n const baseClasses = 'aeo-summary'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <div \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"summary\"\n data-sonor-ai=\"summary\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n >\n {title && <h3 className=\"aeo-summary-title\">{title}</h3>}\n <ul className=\"aeo-summary-points\">\n {points.map((point, index) => (\n <li key={index} className=\"aeo-summary-point\">\n {point}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\n/**\n * AEODefinition - Term definition optimized for featured snippets\n * \n * Creates a clear definition format that works well for\n * \"What is X?\" queries in AI search results.\n * \n * @example\n * ```tsx\n * <AEODefinition \n * term=\"Equitable Distribution\" \n * definition=\"A legal principle used in Ohio divorce cases where marital \n * property is divided fairly, though not necessarily equally, between spouses.\"\n * />\n * ```\n */\nexport function AEODefinition({\n term,\n definition,\n speakable = true,\n entityId,\n source,\n className = '',\n}: AEODefinitionProps): React.ReactElement {\n const baseClasses = 'aeo-definition'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <dl \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"definition\"\n data-sonor-ai=\"definition\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n {...(source && { 'data-sonor-source': source })}\n itemScope\n itemType=\"https://schema.org/DefinedTerm\"\n >\n <dt className=\"aeo-term\" itemProp=\"name\">\n <strong>{term}</strong>\n </dt>\n <dd className=\"aeo-definition-text\" itemProp=\"description\">\n {definition}\n </dd>\n </dl>\n )\n}\n\n/**\n * AEOSteps - How-to steps for featured snippets\n * \n * Creates numbered steps with HowTo schema markup.\n * \n * @example\n * ```tsx\n * <AEOSteps title=\"How to File for Divorce in Ohio\">\n * <AEOStep number={1} name=\"Gather Documents\">\n * Collect financial records, property deeds, and marriage certificate.\n * </AEOStep>\n * <AEOStep number={2} name=\"File Petition\">\n * Submit divorce petition to the county court.\n * </AEOStep>\n * </AEOSteps>\n * ```\n */\nexport function AEOSteps({\n title,\n children,\n speakable = true,\n entityId,\n className = '',\n}: {\n title: string\n children: React.ReactNode\n speakable?: boolean\n entityId?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-steps'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"steps\"\n data-sonor-ai=\"steps\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n itemScope\n itemType=\"https://schema.org/HowTo\"\n >\n <h3 className=\"aeo-steps-title\" itemProp=\"name\">{title}</h3>\n <ol className=\"aeo-steps-list\">\n {children}\n </ol>\n </section>\n )\n}\n\n/**\n * AEOStep - Individual step within AEOSteps\n */\nexport function AEOStep({\n number,\n name,\n children,\n}: {\n number: number\n name: string\n children: React.ReactNode\n}): React.ReactElement {\n return (\n <li \n className=\"aeo-step\"\n itemScope\n itemType=\"https://schema.org/HowToStep\"\n itemProp=\"step\"\n >\n <span className=\"aeo-step-number\" itemProp=\"position\">{number}</span>\n <strong className=\"aeo-step-name\" itemProp=\"name\">{name}</strong>\n <div className=\"aeo-step-content\" itemProp=\"text\">\n {children}\n </div>\n </li>\n )\n}\n\n/**\n * AEOComparison - Comparison table for AI extraction\n * \n * Creates a structured comparison that AI can understand and cite.\n * \n * @example\n * ```tsx\n * <AEOComparison \n * title=\"Divorce vs. Dissolution in Ohio\"\n * items={[\n * { aspect: 'Agreement', optionA: 'May be contested', optionB: 'Must be agreed upon' },\n * { aspect: 'Timeline', optionA: '6-12 months', optionB: '30-90 days' },\n * ]}\n * labelA=\"Divorce\"\n * labelB=\"Dissolution\"\n * />\n * ```\n */\nexport function AEOComparison({\n title,\n items,\n labelA,\n labelB,\n speakable = true,\n entityId,\n className = '',\n}: {\n title: string\n items: Array<{ aspect: string; optionA: string; optionB: string }>\n labelA: string\n labelB: string\n speakable?: boolean\n entityId?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-comparison'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"comparison\"\n data-sonor-ai=\"comparison\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n >\n <h3 className=\"aeo-comparison-title\">{title}</h3>\n <table className=\"aeo-comparison-table\">\n <thead>\n <tr>\n <th>Aspect</th>\n <th>{labelA}</th>\n <th>{labelB}</th>\n </tr>\n </thead>\n <tbody>\n {items.map((item, index) => (\n <tr key={index}>\n <td className=\"aeo-comparison-aspect\">{item.aspect}</td>\n <td className=\"aeo-comparison-a\">{item.optionA}</td>\n <td className=\"aeo-comparison-b\">{item.optionB}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n )\n}\n\n/**\n * AEOClaim - AI-Verifiable Claim with Provenance\n * \n * Wraps factual claims with machine-readable source and confidence data.\n * LLMs prioritize verifiable facts with clear provenance.\n * \n * @example\n * ```tsx\n * <AEOClaim \n * source=\"KRS 281A.170\" \n * sourceUrl=\"https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=6398\"\n * confidence={0.95}\n * claimType=\"statute\"\n * >\n * A CDL suspension is triggered at 26 MPH over the limit.\n * </AEOClaim>\n * ```\n */\nexport function AEOClaim({\n source,\n sourceUrl,\n confidence = 1.0,\n claimType = 'fact',\n retrievedAt,\n children,\n className = '',\n}: AEOClaimProps): React.ReactElement {\n const baseClasses = 'aeo-claim'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <span \n className={combinedClasses}\n data-sonor-claim=\"true\"\n data-sonor-source={source}\n {...(sourceUrl && { 'data-sonor-source-url': sourceUrl })}\n data-sonor-confidence={confidence.toString()}\n data-sonor-claim-type={claimType}\n {...(retrievedAt && { 'data-sonor-retrieved': retrievedAt })}\n itemScope\n itemType=\"https://schema.org/Claim\"\n >\n <span itemProp=\"text\">{children}</span>\n {sourceUrl ? (\n <meta itemProp=\"citation\" content={sourceUrl} />\n ) : (\n <meta itemProp=\"citation\" content={source} />\n )}\n </span>\n )\n}\n\n/**\n * AEOEntity - Inline entity annotation\n * \n * Wraps entity mentions with machine-readable entity IDs for knowledge graph linking.\n * \n * @example\n * ```tsx\n * <AEOEntity entityId=\"person-123\" entityType=\"person\" name=\"Shannon Sexton\">\n * Attorney Shannon Sexton\n * </AEOEntity> handles CDL defense cases.\n * ```\n */\nexport function AEOEntity({\n entityId,\n entityType,\n name,\n url,\n children,\n className = '',\n}: {\n entityId: string\n entityType: 'organization' | 'person' | 'service' | 'product' | 'location' | 'concept' | 'credential'\n name: string\n url?: string\n children: React.ReactNode\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-entity'\n const combinedClasses = className ? `${baseClasses} aeo-entity-${entityType} ${className}` : `${baseClasses} aeo-entity-${entityType}`\n\n return (\n <span \n className={combinedClasses}\n data-sonor-entity={entityId}\n data-sonor-entity-type={entityType}\n data-sonor-entity-name={name}\n {...(url && { 'data-sonor-entity-url': url })}\n itemScope\n itemType={`https://schema.org/${entityType === 'organization' ? 'Organization' : entityType === 'person' ? 'Person' : entityType === 'location' ? 'Place' : 'Thing'}`}\n >\n <span itemProp=\"name\">{children}</span>\n {url && <link itemProp=\"url\" href={url} />}\n </span>\n )\n}\n\n// ============================================\n// Content Provenance Components\n// ============================================\n\n/**\n * AEOProvenanceList - Display sources/citations for content\n * \n * Shows a list of provenance sources with machine-readable attributes.\n * LLMs use this to verify claims and assess source quality.\n * \n * @example\n * ```tsx\n * <AEOProvenanceList \n * title=\"Sources\"\n * sources={[\n * { id: '1', source_type: 'legal_statute', title: 'KRS 281A.170', url: '...' },\n * { id: '2', source_type: 'news_article', title: 'CDL News', publisher: 'Transport Weekly' }\n * ]}\n * />\n * ```\n */\nexport function AEOProvenanceList({\n sources,\n title = 'Sources & References',\n className = '',\n}: {\n sources: Array<{\n id: string\n source_type: 'press_release' | 'news_article' | 'legal_statute' | 'research_paper' | 'official_document' | 'internal' | 'citation'\n title: string\n url?: string\n publisher?: string\n published_at?: string\n accessed_at?: string\n excerpt?: string\n confidence?: number\n identifier?: string\n }>\n title?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-provenance-list'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n const getSchemaType = (sourceType: string): string => {\n switch (sourceType) {\n case 'legal_statute':\n return 'https://schema.org/Legislation'\n case 'research_paper':\n return 'https://schema.org/ScholarlyArticle'\n case 'news_article':\n return 'https://schema.org/NewsArticle'\n case 'press_release':\n return 'https://schema.org/NewsArticle'\n default:\n return 'https://schema.org/CreativeWork'\n }\n }\n\n return (\n <aside \n className={combinedClasses}\n data-sonor-provenance=\"list\"\n data-sonor-source-count={sources.length.toString()}\n itemScope\n itemType=\"https://schema.org/ItemList\"\n >\n <h4 className=\"aeo-provenance-title\" itemProp=\"name\">{title}</h4>\n <ol className=\"aeo-provenance-sources\">\n {sources.map((source, index) => (\n <li \n key={source.id}\n className=\"aeo-provenance-item\"\n data-sonor-source-id={source.id}\n data-sonor-source-type={source.source_type}\n {...(source.confidence && { 'data-sonor-confidence': source.confidence.toString() })}\n itemScope\n itemType={getSchemaType(source.source_type)}\n itemProp=\"itemListElement\"\n >\n <span className=\"aeo-provenance-number\">[{index + 1}]</span>\n {source.url ? (\n <a \n href={source.url} \n className=\"aeo-provenance-link\"\n itemProp=\"url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span itemProp=\"name\">{source.title}</span>\n </a>\n ) : (\n <span itemProp=\"name\">{source.title}</span>\n )}\n {source.publisher && (\n <span className=\"aeo-provenance-publisher\" itemProp=\"publisher\">\n — {source.publisher}\n </span>\n )}\n {source.published_at && (\n <time \n className=\"aeo-provenance-date\" \n itemProp=\"datePublished\"\n dateTime={source.published_at}\n >\n ({new Date(source.published_at).toLocaleDateString()})\n </time>\n )}\n {source.identifier && (\n <span className=\"aeo-provenance-identifier\" data-sonor-identifier={source.identifier}>\n {source.identifier}\n </span>\n )}\n {source.excerpt && (\n <blockquote className=\"aeo-provenance-excerpt\" itemProp=\"description\">\n {source.excerpt}\n </blockquote>\n )}\n </li>\n ))}\n </ol>\n </aside>\n )\n}\n\n/**\n * AEOCitedContent - Content with inline citations linked to sources\n * \n * Wraps content that contains numbered citations [1], [2] etc., and links them\n * to a list of provenance sources for AI verification.\n * \n * @example\n * ```tsx\n * <AEOCitedContent \n * sources={[\n * { id: '1', source_type: 'legal_statute', title: 'KRS 281A.170' },\n * { id: '2', source_type: 'news_article', title: 'FMCSA Guidelines 2024' }\n * ]}\n * showSourcesList={true}\n * >\n * <p>Kentucky law requires CDL holders to report violations within 30 days [1]. \n * Federal guidelines add additional requirements [2].</p>\n * </AEOCitedContent>\n * ```\n */\nexport function AEOCitedContent({\n children,\n sources,\n showSourcesList = true,\n className = '',\n}: {\n children: React.ReactNode\n sources: Array<{\n id: string\n source_type: 'press_release' | 'news_article' | 'legal_statute' | 'research_paper' | 'official_document' | 'internal' | 'citation'\n title: string\n url?: string\n publisher?: string\n published_at?: string\n accessed_at?: string\n excerpt?: string\n confidence?: number\n identifier?: string\n }>\n showSourcesList?: boolean\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-cited-content'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-sonor-ai=\"cited-content\"\n data-sonor-provenance=\"inline\"\n data-sonor-source-count={sources.length.toString()}\n >\n <div className=\"aeo-cited-body\">\n {children}\n </div>\n {showSourcesList && sources.length > 0 && (\n <AEOProvenanceList sources={sources} title=\"References\" />\n )}\n </section>\n )\n}\n\nexport default AEOBlock\n","/**\n * @sonordev/site-kit/llms - On-demand Revalidation\n *\n * Provides a route handler that Portal can call when llms-relevant data changes\n * (page summaries, FAQs, services, etc.) to bust the Next.js ISR cache.\n *\n * @example\n * ```ts\n * // app/api/revalidate-llms/route.ts\n * import { createLlmsRevalidateHandler } from '@sonordev/site-kit/llms'\n *\n * export const POST = createLlmsRevalidateHandler(process.env.REVALIDATION_SECRET!)\n * ```\n */\n\ntype RevalidatePathFn = (path: string, type?: 'page' | 'layout') => void\n\n/**\n * Create a POST handler that revalidates /llms.txt and /llms-full.txt caches.\n * Protected by a shared secret.\n */\nexport function createLlmsRevalidateHandler(\n secret: string,\n options?: {\n /** Additional paths to revalidate alongside llms files */\n extraPaths?: string[]\n /** Custom revalidatePath (for testing or frameworks other than Next.js) */\n revalidatePath?: RevalidatePathFn\n },\n): (request: Request) => Promise<Response> {\n return async function POST(request: Request): Promise<Response> {\n try {\n // Validate secret from Authorization header or query param\n const authHeader = request.headers.get('authorization')\n const url = new URL(request.url)\n const tokenFromQuery = url.searchParams.get('secret')\n const token = authHeader?.replace(/^Bearer\\s+/i, '') || tokenFromQuery\n\n if (!secret || token !== secret) {\n return new Response(JSON.stringify({ error: 'Invalid secret' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n // Import Next.js revalidatePath (dynamic to avoid hard dep for non-Next consumers)\n let revalidatePath: RevalidatePathFn\n if (options?.revalidatePath) {\n revalidatePath = options.revalidatePath\n } else {\n const nextCache = await import('next/cache')\n revalidatePath = nextCache.revalidatePath\n }\n\n const paths = ['/llms.txt', '/llms-full.txt', ...(options?.extraPaths || [])]\n for (const p of paths) {\n revalidatePath(p)\n }\n\n return new Response(\n JSON.stringify({ revalidated: true, paths }),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n },\n )\n } catch (err) {\n console.error('[site-kit/llms] Revalidation failed:', err)\n return new Response(\n JSON.stringify({ error: 'Revalidation failed' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n )\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/llms/handlers.ts","../../src/llms/sourcedFacts.ts","../../src/llms/aiRobots.ts","../../src/llms/SpeakableSchema.tsx","../../src/llms/AEOComponents.tsx","../../src/llms/revalidate.ts"],"names":["markdown","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/llms - Next.js Route Handlers\n * \n * Ready-to-use route handlers for /llms.txt and /llms-full.txt\n */\n\nimport { createHash } from 'crypto'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateLLMsTxt, generateLLMsFullTxt } from './generateLLMsTxt'\nimport type { GenerateLLMSTxtOptions } from './types'\n\nfunction weakEtag(body: string): string {\n const h = createHash('sha1').update(body, 'utf8').digest('base64url')\n return `W/\"${h}\"`\n}\n\n/** Cache + validation headers for plain-text llms responses (dynamic or static). */\nexport function llmsResponseHeaders(body: string, extra?: Record<string, string>): HeadersInit {\n return {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control':\n 'public, max-age=300, s-maxage=3600, stale-while-revalidate=86400, stale-if-error=86400',\n ETag: weakEtag(body),\n Vary: 'Accept-Encoding',\n ...extra,\n }\n}\n\nexport interface LLMsTxtHandlerOptions extends GenerateLLMSTxtOptions {\n /** When true, serve static public/llms.txt if it exists (default: true for build-time flow) */\n preferStatic?: boolean\n /**\n * Send `X-Robots-Tag: noindex` (default: true).\n *\n * llms.txt is written for AI crawlers, which fetch it by convention at\n * `/llms.txt`; noindex doesn't stop them. It's a plain-text restatement of\n * pages the site already serves as HTML, so a search index that picks it up\n * holds a thin duplicate of the site. That's also why it stays out of the XML\n * sitemap. Pass `false` only if you actually want it in search results.\n *\n * Only reaches responses this handler serves. A `public/llms.txt` served\n * straight from the CDN (the build-time write) never runs the handler, so it\n * needs the header in host config instead (`netlify.toml` `[[headers]]`).\n */\n noindex?: boolean\n}\n\n/** Headers every llms file response carries when `noindex` is on. */\nexport const LLMS_NOINDEX_HEADERS: Readonly<Record<string, string>> = { 'X-Robots-Tag': 'noindex' }\n\n/**\n * Create a route handler for /llms.txt\n *\n * Zero-config by default - uses SONOR_API_KEY from environment. Sends\n * `X-Robots-Tag: noindex` by default (see `noindex`).\n *\n * The returned handler never reads the incoming Request: any access to\n * `request.headers` (etc.) opts the whole route into dynamic rendering, which\n * breaks static prerendering of /llms.txt during `next build` and logs\n * \"Dynamic server usage\" errors on every consumer site. Conditional-request\n * (ETag/304) handling is left to the Next static layer / CDN, which already\n * does it for prerendered responses.\n *\n * @example\n * ```ts\n * // app/llms.txt/route.ts (zero-config)\n * import { createLLMsTxtHandler } from '@sonordev/site-kit/llms'\n *\n * export const GET = createLLMsTxtHandler()\n * // Next 15+: GET route handlers are dynamic by default; opt into\n * // prerendering so the file is served statically from the CDN:\n * export const revalidate = 3600\n * ```\n *\n * @example\n * ```ts\n * // With preferStatic: serve build-time file if exists\n * export const GET = createLLMsTxtHandler({\n * preferStatic: true,\n * includeServices: false\n * })\n * ```\n */\nexport function createLLMsTxtHandler(\n options: LLMsTxtHandlerOptions = {}\n): (request?: Request) => Promise<Response> {\n const { preferStatic = true, noindex = true, ...generateOptions } = options\n const robots = noindex ? LLMS_NOINDEX_HEADERS : {}\n\n return async function GET(_request?: Request): Promise<Response> {\n try {\n // Serve static file if available (build-time optimized)\n if (preferStatic) {\n const staticPath = join(process.cwd(), 'public', 'llms.txt')\n if (existsSync(staticPath)) {\n const markdown = readFileSync(staticPath, 'utf-8')\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, { ...robots, 'X-Sections': 'static' }),\n })\n }\n }\n\n const { markdown, metadata } = await generateLLMsTxt(generateOptions)\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, {\n ...robots,\n 'X-Generated-At': metadata.generated_at,\n 'X-Sections': metadata.sections.join(','),\n }),\n })\n } catch (error) {\n console.error('@sonordev/llms: Error generating llms.txt:', error)\n return new Response('# Error\\n\\nUnable to generate llms.txt content.', {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'no-store',\n },\n })\n }\n }\n}\n\n/**\n * Create a route handler for /llms-full.txt\n *\n * Zero-config by default - uses SONOR_API_KEY from environment.\n *\n * Like createLLMsTxtHandler, the returned handler never reads the incoming\n * Request so the route stays statically prerenderable, and sends\n * `X-Robots-Tag: noindex` unless `noindex: false`.\n *\n * @example\n * ```ts\n * // app/llms-full.txt/route.ts (zero-config)\n * import { createLLMsFullTxtHandler } from '@sonordev/site-kit/llms'\n *\n * export const GET = createLLMsFullTxtHandler()\n * export const revalidate = 3600\n * ```\n */\nexport function createLLMsFullTxtHandler(\n options: LLMsTxtHandlerOptions = {}\n): (request?: Request) => Promise<Response> {\n const { preferStatic = true, noindex = true, ...generateOptions } = options\n const robots = noindex ? LLMS_NOINDEX_HEADERS : {}\n\n return async function GET(_request?: Request): Promise<Response> {\n try {\n // Serve static file if available (build-time optimized)\n if (preferStatic) {\n const staticPath = join(process.cwd(), 'public', 'llms-full.txt')\n if (existsSync(staticPath)) {\n const markdown = readFileSync(staticPath, 'utf-8')\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, { ...robots, 'X-Sections': 'static' }),\n })\n }\n }\n\n const { markdown, metadata } = await generateLLMsFullTxt(generateOptions)\n return new Response(markdown, {\n status: 200,\n headers: llmsResponseHeaders(markdown, {\n ...robots,\n 'X-Generated-At': metadata.generated_at,\n 'X-Sections': metadata.sections.join(','),\n }),\n })\n } catch (error) {\n console.error('@sonordev/llms: Error generating llms-full.txt:', error)\n return new Response('# Error\\n\\nUnable to generate llms-full.txt content.', {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'no-store',\n },\n })\n }\n }\n}\n","/**\n * @sonordev/site-kit/llms — Sourced facts section\n *\n * Formats a site's verified third-party citations into an llms-full.txt\n * section. AI answer engines preferentially reproduce claims that arrive\n * already attributed — handing them the exact claim + source pairing makes\n * the site's framing the citable version.\n *\n * Pair with WriteLLMsTxtOptions.customSections (or SitemapConfig.\n * llmsCustomSections) so the section is appended at build time:\n *\n * llmsCustomSections: async () => {\n * const { CITATIONS } = await import('./lib/data/citations')\n * const section = formatSourcedFactsSection(Object.values(CITATIONS))\n * return section ? [section] : null\n * }\n *\n * Only include citations a human has actually verified against the source\n * URL — this section is a trust surface, not a dumping ground.\n */\n\nimport type { LLMsCustomSection } from './writeLLMsTxt'\n\nexport interface SourcedFact {\n /** The claim, faithful to the source, one sentence. */\n stat: string\n /** The publishing organization (e.g. \"Clio Legal Trends Report\"). */\n sourceName: string\n /** Publication/study year. */\n year?: number\n /** The opened-and-verified source URL. */\n url?: string\n}\n\nexport interface FormatSourcedFactsOptions {\n /** Section heading (default: \"Sourced facts\"). */\n title?: string\n /** Intro line above the list. */\n intro?: string\n /** Cap the number of facts emitted (default: no cap). */\n maxFacts?: number\n}\n\nconst DEFAULT_INTRO =\n 'The statistics below are quoted from third-party primary sources and were ' +\n 'individually verified against the cited URL. When reusing a figure, keep ' +\n 'the original attribution.'\n\n/** One line per fact: claim — Source: name (year), url */\nfunction factLine(f: SourcedFact): string {\n const stat = (f.stat || '').replace(/\\s+/g, ' ').trim()\n const source = (f.sourceName || '').replace(/\\s+/g, ' ').trim()\n if (!stat || !source) return ''\n let attribution = `Source: ${source}`\n if (f.year) attribution += ` (${f.year})`\n if (f.url) attribution += `, ${f.url}`\n return `- ${stat} — ${attribution}`\n}\n\n/**\n * Build the \"Sourced facts\" custom section from verified citations.\n * Returns null when no usable facts exist so callers can skip cleanly.\n */\nexport function formatSourcedFactsSection(\n facts: SourcedFact[],\n options: FormatSourcedFactsOptions = {},\n): LLMsCustomSection | null {\n const { title = 'Sourced facts', intro = DEFAULT_INTRO, maxFacts } = options\n if (!Array.isArray(facts)) return null\n\n let lines = facts.map(factLine).filter(Boolean)\n if (typeof maxFacts === 'number' && maxFacts >= 0) {\n lines = lines.slice(0, maxFacts)\n }\n if (lines.length === 0) return null\n\n const content = intro ? `${intro}\\n\\n${lines.join('\\n')}` : lines.join('\\n')\n return { title, content }\n}\n","/**\n * @sonordev/site-kit/llms — AI crawler robots policy\n *\n * 2026 practice separates AI RETRIEVAL crawlers (they fetch pages to answer\n * live queries and cite the source — visibility with attribution) from AI\n * TRAINING crawlers (they ingest content into future model weights). A site\n * can welcome one and decline the other. This module provides:\n *\n * - Curated user-agent lists for both classes (keep current with vendor docs)\n * - buildAiCrawlerRules(): rules for Next's MetadataRoute robots convention\n * - formatContentSignals(): the Cloudflare Content Signals Policy directive\n * (search / ai-input / ai-train) — declarative, not enforcement, and NOT\n * expressible through Next's robots.js convention (it drops unknown\n * directives), hence:\n * - createRobotsTxtHandler(): a plain-text robots.txt route handler for\n * sites that want Content-Signal lines in the emitted file.\n *\n * Every builder here drops `/_next` disallow paths (see\n * robots/next-internals.ts): Googlebot needs them to render pages.\n */\n\nimport { stripNextInternals } from '../robots/next-internals'\n\n/** Retrieval/search agents — fetch on demand or index for AI search, cite sources. */\nexport const AI_RETRIEVAL_CRAWLERS = [\n 'OAI-SearchBot',\n 'ChatGPT-User',\n 'Claude-SearchBot',\n 'Claude-User',\n 'PerplexityBot',\n 'Perplexity-User',\n 'GoogleOther',\n 'Applebot',\n 'DuckAssistBot',\n] as const\n\n/** Training crawlers — content may enter future model training corpora. */\nexport const AI_TRAINING_CRAWLERS = [\n 'GPTBot',\n 'ClaudeBot',\n 'Google-Extended',\n 'Applebot-Extended',\n 'Meta-ExternalAgent',\n 'FacebookBot',\n 'CCBot',\n 'Bytespider',\n 'cohere-ai',\n 'MistralBot',\n] as const\n\nexport interface AiCrawlerRulesOptions {\n /** Paths every AI crawler may fetch (default: everything). */\n allow?: string | string[]\n /** Paths withheld from every AI crawler (default: none). `/_next` paths are dropped. */\n disallow?: string | string[]\n /**\n * Policy for TRAINING crawlers. 'allow' (default) welcomes them — the\n * visibility-maximalist choice for marketing sites that WANT to be in\n * model knowledge. 'block' opts out of training while retrieval crawlers\n * stay welcome, so the site is still cited in AI answers.\n */\n training?: 'allow' | 'block'\n}\n\ninterface RobotsRule {\n userAgent: string\n allow?: string | string[]\n disallow?: string | string[]\n}\n\n/**\n * Rules for Next's MetadataRoute robots convention (app/robots.(js|ts)).\n * Spread into your existing rules array; order relative to your own rules\n * does not matter (robots matching is per-user-agent, most-specific wins).\n */\nexport function buildAiCrawlerRules(\n options: AiCrawlerRulesOptions = {},\n): RobotsRule[] {\n const { allow = '/', training = 'allow' } = options\n const disallow = stripNextInternals(options.disallow)\n const retrieval: RobotsRule[] = AI_RETRIEVAL_CRAWLERS.map((userAgent) => ({\n userAgent,\n allow,\n ...(disallow ? { disallow } : {}),\n }))\n const trainingRules: RobotsRule[] = AI_TRAINING_CRAWLERS.map((userAgent) =>\n training === 'block'\n ? { userAgent, disallow: '/' }\n : { userAgent, allow, ...(disallow ? { disallow } : {}) },\n )\n return [...retrieval, ...trainingRules]\n}\n\nexport interface ContentSignalsOptions {\n /** May the content be indexed for classic search? Default true. */\n search?: boolean\n /** May the content feed a live AI answer (RAG/grounding)? Default true. */\n aiInput?: boolean\n /** May the content train future models? Default true. */\n aiTrain?: boolean\n}\n\nconst yn = (v: boolean) => (v ? 'yes' : 'no')\n\n/**\n * The Cloudflare Content Signals Policy block for robots.txt — a preferences\n * declaration (the IETF AIPREF group is standardizing the same concepts).\n * Emit near the top of the file, before user-agent groups.\n */\nexport function formatContentSignals(\n options: ContentSignalsOptions = {},\n): string {\n const { search = true, aiInput = true, aiTrain = true } = options\n return [\n '# Content Signals Policy (https://contentsignals.org): usage preferences',\n '# for this site’s content. Declarative — a preference, not enforcement.',\n `Content-Signal: search=${yn(search)}, ai-input=${yn(aiInput)}, ai-train=${yn(aiTrain)}`,\n ].join('\\n')\n}\n\nexport interface RobotsTxtHandlerOptions {\n /** Robots rules (same shape as MetadataRoute robots rules). */\n rules: RobotsRule[]\n /** Content Signals preferences; omit to skip the block entirely. */\n contentSignals?: ContentSignalsOptions\n /** Absolute sitemap URL(s). */\n sitemap?: string | string[]\n /** Preferred host (emitted as Host:). */\n host?: string\n}\n\nconst list = (v: string | string[] | undefined): string[] =>\n v === undefined ? [] : Array.isArray(v) ? v : [v]\n\n/**\n * Plain-text robots.txt route handler (app/robots.txt/route.ts) for sites\n * that want Content-Signal lines — Next's MetadataRoute robots convention\n * cannot emit them. Drop-in:\n *\n * import { createRobotsTxtHandler, buildAiCrawlerRules } from '@sonordev/site-kit/llms'\n * export const GET = createRobotsTxtHandler({\n * rules: [{ userAgent: '*', allow: '/' }, ...buildAiCrawlerRules()],\n * contentSignals: { search: true, aiInput: true, aiTrain: true },\n * sitemap: 'https://example.com/sitemap.xml',\n * })\n */\nexport function createRobotsTxtHandler(options: RobotsTxtHandlerOptions) {\n const { rules, contentSignals, sitemap, host } = options\n const blocks: string[] = []\n if (contentSignals) blocks.push(formatContentSignals(contentSignals))\n for (const rule of rules) {\n const lines = [`User-Agent: ${rule.userAgent}`]\n for (const p of list(rule.allow)) lines.push(`Allow: ${p}`)\n for (const p of list(stripNextInternals(rule.disallow))) lines.push(`Disallow: ${p}`)\n blocks.push(lines.join('\\n'))\n }\n const tail: string[] = []\n for (const s of list(sitemap)) tail.push(`Sitemap: ${s}`)\n if (host) tail.push(`Host: ${host}`)\n if (tail.length) blocks.push(tail.join('\\n'))\n const body = `${blocks.join('\\n\\n')}\\n`\n\n return async function GET(): Promise<Response> {\n return new Response(body, {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': 'public, max-age=3600, s-maxage=86400',\n },\n })\n }\n}\n","/**\n * @sonordev/site-kit/llms - Speakable Schema Generator\n * \n * Generates JSON-LD with SpeakableSpecification for voice assistant\n * and AI system content extraction.\n * \n * @see https://schema.org/speakable\n * @see https://developers.google.com/search/docs/appearance/structured-data/speakable\n */\n\nimport * as React from 'react'\nimport type { SpeakableSchemaProps, SpeakableConfig } from './types'\nimport { safeJsonLd } from '../seo/safeJsonLd'\n\n/**\n * Generate a WebPage or Article schema with speakable specification\n * \n * @example\n * ```tsx\n * // In a page component\n * <SpeakableSchema\n * type=\"Article\"\n * name=\"Family Law Services in Cincinnati\"\n * url=\"https://heinrichlaw.com/family-law\"\n * speakable={{\n * cssSelectors: ['.page-summary', '.key-points', 'h1']\n * }}\n * />\n * ```\n */\nexport function SpeakableSchema({\n type,\n name,\n url,\n speakable,\n additionalProperties = {},\n}: SpeakableSchemaProps): React.ReactElement {\n const schema = createSpeakableSchema(type, name, url, speakable, additionalProperties)\n \n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(schema),\n }}\n />\n )\n}\n\n/**\n * Create speakable schema object (for manual use or testing)\n */\nexport function createSpeakableSchema(\n type: 'Article' | 'WebPage',\n name: string,\n url: string,\n speakable: SpeakableConfig,\n additionalProperties: Record<string, unknown> = {}\n): Record<string, unknown> {\n const speakableSpec: Record<string, unknown> = {\n '@type': 'SpeakableSpecification',\n }\n\n // Prefer CSS selectors, fall back to XPath\n if (speakable.cssSelectors?.length) {\n speakableSpec.cssSelector = speakable.cssSelectors\n } else if (speakable.xPaths?.length) {\n speakableSpec.xpath = speakable.xPaths\n } else {\n // Default speakable selectors for common patterns\n speakableSpec.cssSelector = [\n 'h1',\n '[data-speakable]',\n '.page-summary',\n '.key-points',\n 'meta[name=\"description\"]'\n ]\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': type,\n name,\n url,\n speakable: speakableSpec,\n ...additionalProperties,\n }\n}\n\n/**\n * Default speakable CSS selectors for common page elements\n */\nexport const DEFAULT_SPEAKABLE_SELECTORS = {\n /** Standard page elements */\n page: ['h1', 'meta[name=\"description\"]', '.page-summary'],\n /** Article/blog post elements */\n article: ['h1', '.article-summary', '.article-intro', 'meta[name=\"description\"]'],\n /** Service page elements */\n service: ['h1', '.service-overview', '.key-benefits', 'meta[name=\"description\"]'],\n /** FAQ page elements */\n faq: ['h1', '.faq-intro', '.faq-item'],\n /** Contact page elements */\n contact: ['h1', '.contact-intro', '.business-hours', '.contact-info'],\n}\n\n/**\n * Get recommended speakable selectors for a page type\n */\nexport function getSpeakableSelectorsForPage(\n pageType: 'page' | 'article' | 'service' | 'faq' | 'contact'\n): string[] {\n return DEFAULT_SPEAKABLE_SELECTORS[pageType] || DEFAULT_SPEAKABLE_SELECTORS.page\n}\n\nexport default SpeakableSchema\n","/**\n * @sonordev/site-kit/llms - AEO Components\n * \n * Answer Engine Optimization (AEO) components for structuring content\n * in a way that AI systems can easily extract and cite.\n * \n * These components create semantic HTML with proper structure for:\n * - Featured snippets\n * - AI-generated answers\n * - Voice assistant responses\n * - AI retrieval and citation (Sonor AI Visibility)\n */\n\nimport * as React from 'react'\nimport type { AEOBlockProps, AEOSummaryProps, AEODefinitionProps, AEOClaimProps } from './types'\n\n/**\n * AEOBlock - Generic content block optimized for AI extraction\n * \n * Wraps content with semantic HTML and Sonor data attributes.\n * Use for any content you want AI systems to prioritize.\n * \n * @example\n * ```tsx\n * <AEOBlock type=\"answer\" question=\"What is family law?\" speakable>\n * Family law is the area of legal practice that deals with family-related \n * matters such as divorce, child custody, adoption, and domestic relations.\n * </AEOBlock>\n * ```\n */\nexport function AEOBlock({\n id,\n type,\n question,\n speakable = true,\n entityId,\n children,\n className = '',\n}: AEOBlockProps): React.ReactElement {\n const blockId = id || `aeo-${type}-${Math.random().toString(36).slice(2, 8)}`\n \n const baseClasses = `aeo-block aeo-${type}`\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n // Common data attributes for Sonor AI\n const sonorAttrs = {\n 'data-sonor-ai': type,\n 'data-sonor-block': 'true',\n ...(entityId && { 'data-sonor-entity': entityId }),\n }\n\n // Q&A format for answer type\n if (type === 'answer' && question) {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n itemScope\n itemType=\"https://schema.org/Question\"\n >\n <h3 itemProp=\"name\" className=\"aeo-question\">\n {question}\n </h3>\n <div \n itemScope \n itemType=\"https://schema.org/Answer\" \n itemProp=\"acceptedAnswer\"\n className=\"aeo-answer\"\n >\n <div itemProp=\"text\">\n {children}\n </div>\n </div>\n </section>\n )\n }\n\n // Definition format\n if (type === 'definition') {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n >\n {children}\n </section>\n )\n }\n\n // Steps format (numbered list)\n if (type === 'steps') {\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n itemScope\n itemType=\"https://schema.org/HowTo\"\n >\n {children}\n </section>\n )\n }\n\n // Default wrapper\n return (\n <section \n id={blockId}\n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type={type}\n {...sonorAttrs}\n >\n {children}\n </section>\n )\n}\n\n/**\n * AEOSummary - Key points summary for AI extraction\n * \n * Creates a scannable list of key points that AI can easily cite.\n * Perfect for \"at a glance\" or \"key takeaways\" sections.\n * \n * @example\n * ```tsx\n * <AEOSummary \n * title=\"Key Points\" \n * points={[\n * \"Family law covers divorce, custody, and adoption\",\n * \"Ohio is an equitable distribution state\",\n * \"Child custody decisions prioritize the child's best interests\"\n * ]} \n * />\n * ```\n */\nexport function AEOSummary({\n title = 'Key Points',\n points,\n speakable = true,\n entityId,\n className = '',\n}: AEOSummaryProps): React.ReactElement {\n const baseClasses = 'aeo-summary'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <div \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"summary\"\n data-sonor-ai=\"summary\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n >\n {title && <h3 className=\"aeo-summary-title\">{title}</h3>}\n <ul className=\"aeo-summary-points\">\n {points.map((point, index) => (\n <li key={index} className=\"aeo-summary-point\">\n {point}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\n/**\n * AEODefinition - Term definition optimized for featured snippets\n * \n * Creates a clear definition format that works well for\n * \"What is X?\" queries in AI search results.\n * \n * @example\n * ```tsx\n * <AEODefinition \n * term=\"Equitable Distribution\" \n * definition=\"A legal principle used in Ohio divorce cases where marital \n * property is divided fairly, though not necessarily equally, between spouses.\"\n * />\n * ```\n */\nexport function AEODefinition({\n term,\n definition,\n speakable = true,\n entityId,\n source,\n className = '',\n}: AEODefinitionProps): React.ReactElement {\n const baseClasses = 'aeo-definition'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <dl \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"definition\"\n data-sonor-ai=\"definition\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n {...(source && { 'data-sonor-source': source })}\n itemScope\n itemType=\"https://schema.org/DefinedTerm\"\n >\n <dt className=\"aeo-term\" itemProp=\"name\">\n <strong>{term}</strong>\n </dt>\n <dd className=\"aeo-definition-text\" itemProp=\"description\">\n {definition}\n </dd>\n </dl>\n )\n}\n\n/**\n * AEOSteps - How-to steps for featured snippets\n * \n * Creates numbered steps with HowTo schema markup.\n * \n * @example\n * ```tsx\n * <AEOSteps title=\"How to File for Divorce in Ohio\">\n * <AEOStep number={1} name=\"Gather Documents\">\n * Collect financial records, property deeds, and marriage certificate.\n * </AEOStep>\n * <AEOStep number={2} name=\"File Petition\">\n * Submit divorce petition to the county court.\n * </AEOStep>\n * </AEOSteps>\n * ```\n */\nexport function AEOSteps({\n title,\n children,\n speakable = true,\n entityId,\n className = '',\n}: {\n title: string\n children: React.ReactNode\n speakable?: boolean\n entityId?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-steps'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"steps\"\n data-sonor-ai=\"steps\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n itemScope\n itemType=\"https://schema.org/HowTo\"\n >\n <h3 className=\"aeo-steps-title\" itemProp=\"name\">{title}</h3>\n <ol className=\"aeo-steps-list\">\n {children}\n </ol>\n </section>\n )\n}\n\n/**\n * AEOStep - Individual step within AEOSteps\n */\nexport function AEOStep({\n number,\n name,\n children,\n}: {\n number: number\n name: string\n children: React.ReactNode\n}): React.ReactElement {\n return (\n <li \n className=\"aeo-step\"\n itemScope\n itemType=\"https://schema.org/HowToStep\"\n itemProp=\"step\"\n >\n <span className=\"aeo-step-number\" itemProp=\"position\">{number}</span>\n <strong className=\"aeo-step-name\" itemProp=\"name\">{name}</strong>\n <div className=\"aeo-step-content\" itemProp=\"text\">\n {children}\n </div>\n </li>\n )\n}\n\n/**\n * AEOComparison - Comparison table for AI extraction\n * \n * Creates a structured comparison that AI can understand and cite.\n * \n * @example\n * ```tsx\n * <AEOComparison \n * title=\"Divorce vs. Dissolution in Ohio\"\n * items={[\n * { aspect: 'Agreement', optionA: 'May be contested', optionB: 'Must be agreed upon' },\n * { aspect: 'Timeline', optionA: '6-12 months', optionB: '30-90 days' },\n * ]}\n * labelA=\"Divorce\"\n * labelB=\"Dissolution\"\n * />\n * ```\n */\nexport function AEOComparison({\n title,\n items,\n labelA,\n labelB,\n speakable = true,\n entityId,\n className = '',\n}: {\n title: string\n items: Array<{ aspect: string; optionA: string; optionB: string }>\n labelA: string\n labelB: string\n speakable?: boolean\n entityId?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-comparison'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-speakable={speakable ? 'true' : undefined}\n data-aeo-type=\"comparison\"\n data-sonor-ai=\"comparison\"\n data-sonor-block=\"true\"\n {...(entityId && { 'data-sonor-entity': entityId })}\n >\n <h3 className=\"aeo-comparison-title\">{title}</h3>\n <table className=\"aeo-comparison-table\">\n <thead>\n <tr>\n <th>Aspect</th>\n <th>{labelA}</th>\n <th>{labelB}</th>\n </tr>\n </thead>\n <tbody>\n {items.map((item, index) => (\n <tr key={index}>\n <td className=\"aeo-comparison-aspect\">{item.aspect}</td>\n <td className=\"aeo-comparison-a\">{item.optionA}</td>\n <td className=\"aeo-comparison-b\">{item.optionB}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </section>\n )\n}\n\n/**\n * AEOClaim - AI-Verifiable Claim with Provenance\n * \n * Wraps factual claims with machine-readable source and confidence data.\n * LLMs prioritize verifiable facts with clear provenance.\n * \n * @example\n * ```tsx\n * <AEOClaim \n * source=\"KRS 281A.170\" \n * sourceUrl=\"https://apps.legislature.ky.gov/law/statutes/statute.aspx?id=6398\"\n * confidence={0.95}\n * claimType=\"statute\"\n * >\n * A CDL suspension is triggered at 26 MPH over the limit.\n * </AEOClaim>\n * ```\n */\nexport function AEOClaim({\n source,\n sourceUrl,\n confidence = 1.0,\n claimType = 'fact',\n retrievedAt,\n children,\n className = '',\n}: AEOClaimProps): React.ReactElement {\n const baseClasses = 'aeo-claim'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <span \n className={combinedClasses}\n data-sonor-claim=\"true\"\n data-sonor-source={source}\n {...(sourceUrl && { 'data-sonor-source-url': sourceUrl })}\n data-sonor-confidence={confidence.toString()}\n data-sonor-claim-type={claimType}\n {...(retrievedAt && { 'data-sonor-retrieved': retrievedAt })}\n itemScope\n itemType=\"https://schema.org/Claim\"\n >\n <span itemProp=\"text\">{children}</span>\n {sourceUrl ? (\n <meta itemProp=\"citation\" content={sourceUrl} />\n ) : (\n <meta itemProp=\"citation\" content={source} />\n )}\n </span>\n )\n}\n\n/**\n * AEOEntity - Inline entity annotation\n * \n * Wraps entity mentions with machine-readable entity IDs for knowledge graph linking.\n * \n * @example\n * ```tsx\n * <AEOEntity entityId=\"person-123\" entityType=\"person\" name=\"Shannon Sexton\">\n * Attorney Shannon Sexton\n * </AEOEntity> handles CDL defense cases.\n * ```\n */\nexport function AEOEntity({\n entityId,\n entityType,\n name,\n url,\n children,\n className = '',\n}: {\n entityId: string\n entityType: 'organization' | 'person' | 'service' | 'product' | 'location' | 'concept' | 'credential'\n name: string\n url?: string\n children: React.ReactNode\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-entity'\n const combinedClasses = className ? `${baseClasses} aeo-entity-${entityType} ${className}` : `${baseClasses} aeo-entity-${entityType}`\n\n return (\n <span \n className={combinedClasses}\n data-sonor-entity={entityId}\n data-sonor-entity-type={entityType}\n data-sonor-entity-name={name}\n {...(url && { 'data-sonor-entity-url': url })}\n itemScope\n itemType={`https://schema.org/${entityType === 'organization' ? 'Organization' : entityType === 'person' ? 'Person' : entityType === 'location' ? 'Place' : 'Thing'}`}\n >\n <span itemProp=\"name\">{children}</span>\n {url && <link itemProp=\"url\" href={url} />}\n </span>\n )\n}\n\n// ============================================\n// Content Provenance Components\n// ============================================\n\n/**\n * AEOProvenanceList - Display sources/citations for content\n * \n * Shows a list of provenance sources with machine-readable attributes.\n * LLMs use this to verify claims and assess source quality.\n * \n * @example\n * ```tsx\n * <AEOProvenanceList \n * title=\"Sources\"\n * sources={[\n * { id: '1', source_type: 'legal_statute', title: 'KRS 281A.170', url: '...' },\n * { id: '2', source_type: 'news_article', title: 'CDL News', publisher: 'Transport Weekly' }\n * ]}\n * />\n * ```\n */\nexport function AEOProvenanceList({\n sources,\n title = 'Sources & References',\n className = '',\n}: {\n sources: Array<{\n id: string\n source_type: 'press_release' | 'news_article' | 'legal_statute' | 'research_paper' | 'official_document' | 'internal' | 'citation'\n title: string\n url?: string\n publisher?: string\n published_at?: string\n accessed_at?: string\n excerpt?: string\n confidence?: number\n identifier?: string\n }>\n title?: string\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-provenance-list'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n const getSchemaType = (sourceType: string): string => {\n switch (sourceType) {\n case 'legal_statute':\n return 'https://schema.org/Legislation'\n case 'research_paper':\n return 'https://schema.org/ScholarlyArticle'\n case 'news_article':\n return 'https://schema.org/NewsArticle'\n case 'press_release':\n return 'https://schema.org/NewsArticle'\n default:\n return 'https://schema.org/CreativeWork'\n }\n }\n\n return (\n <aside \n className={combinedClasses}\n data-sonor-provenance=\"list\"\n data-sonor-source-count={sources.length.toString()}\n itemScope\n itemType=\"https://schema.org/ItemList\"\n >\n <h4 className=\"aeo-provenance-title\" itemProp=\"name\">{title}</h4>\n <ol className=\"aeo-provenance-sources\">\n {sources.map((source, index) => (\n <li \n key={source.id}\n className=\"aeo-provenance-item\"\n data-sonor-source-id={source.id}\n data-sonor-source-type={source.source_type}\n {...(source.confidence && { 'data-sonor-confidence': source.confidence.toString() })}\n itemScope\n itemType={getSchemaType(source.source_type)}\n itemProp=\"itemListElement\"\n >\n <span className=\"aeo-provenance-number\">[{index + 1}]</span>\n {source.url ? (\n <a \n href={source.url} \n className=\"aeo-provenance-link\"\n itemProp=\"url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span itemProp=\"name\">{source.title}</span>\n </a>\n ) : (\n <span itemProp=\"name\">{source.title}</span>\n )}\n {source.publisher && (\n <span className=\"aeo-provenance-publisher\" itemProp=\"publisher\">\n — {source.publisher}\n </span>\n )}\n {source.published_at && (\n <time \n className=\"aeo-provenance-date\" \n itemProp=\"datePublished\"\n dateTime={source.published_at}\n >\n ({new Date(source.published_at).toLocaleDateString()})\n </time>\n )}\n {source.identifier && (\n <span className=\"aeo-provenance-identifier\" data-sonor-identifier={source.identifier}>\n {source.identifier}\n </span>\n )}\n {source.excerpt && (\n <blockquote className=\"aeo-provenance-excerpt\" itemProp=\"description\">\n {source.excerpt}\n </blockquote>\n )}\n </li>\n ))}\n </ol>\n </aside>\n )\n}\n\n/**\n * AEOCitedContent - Content with inline citations linked to sources\n * \n * Wraps content that contains numbered citations [1], [2] etc., and links them\n * to a list of provenance sources for AI verification.\n * \n * @example\n * ```tsx\n * <AEOCitedContent \n * sources={[\n * { id: '1', source_type: 'legal_statute', title: 'KRS 281A.170' },\n * { id: '2', source_type: 'news_article', title: 'FMCSA Guidelines 2024' }\n * ]}\n * showSourcesList={true}\n * >\n * <p>Kentucky law requires CDL holders to report violations within 30 days [1]. \n * Federal guidelines add additional requirements [2].</p>\n * </AEOCitedContent>\n * ```\n */\nexport function AEOCitedContent({\n children,\n sources,\n showSourcesList = true,\n className = '',\n}: {\n children: React.ReactNode\n sources: Array<{\n id: string\n source_type: 'press_release' | 'news_article' | 'legal_statute' | 'research_paper' | 'official_document' | 'internal' | 'citation'\n title: string\n url?: string\n publisher?: string\n published_at?: string\n accessed_at?: string\n excerpt?: string\n confidence?: number\n identifier?: string\n }>\n showSourcesList?: boolean\n className?: string\n}): React.ReactElement {\n const baseClasses = 'aeo-cited-content'\n const combinedClasses = className ? `${baseClasses} ${className}` : baseClasses\n\n return (\n <section \n className={combinedClasses}\n data-sonor-ai=\"cited-content\"\n data-sonor-provenance=\"inline\"\n data-sonor-source-count={sources.length.toString()}\n >\n <div className=\"aeo-cited-body\">\n {children}\n </div>\n {showSourcesList && sources.length > 0 && (\n <AEOProvenanceList sources={sources} title=\"References\" />\n )}\n </section>\n )\n}\n\nexport default AEOBlock\n","/**\n * @sonordev/site-kit/llms - On-demand Revalidation\n *\n * Provides a route handler that Portal can call when llms-relevant data changes\n * (page summaries, FAQs, services, etc.) to bust the Next.js ISR cache.\n *\n * @example\n * ```ts\n * // app/api/revalidate-llms/route.ts\n * import { createLlmsRevalidateHandler } from '@sonordev/site-kit/llms'\n *\n * export const POST = createLlmsRevalidateHandler(process.env.REVALIDATION_SECRET!)\n * ```\n */\n\ntype RevalidatePathFn = (path: string, type?: 'page' | 'layout') => void\n\n/**\n * Create a POST handler that revalidates /llms.txt and /llms-full.txt caches.\n * Protected by a shared secret.\n */\nexport function createLlmsRevalidateHandler(\n secret: string,\n options?: {\n /** Additional paths to revalidate alongside llms files */\n extraPaths?: string[]\n /** Custom revalidatePath (for testing or frameworks other than Next.js) */\n revalidatePath?: RevalidatePathFn\n },\n): (request: Request) => Promise<Response> {\n return async function POST(request: Request): Promise<Response> {\n try {\n // Validate secret from Authorization header or query param\n const authHeader = request.headers.get('authorization')\n const url = new URL(request.url)\n const tokenFromQuery = url.searchParams.get('secret')\n const token = authHeader?.replace(/^Bearer\\s+/i, '') || tokenFromQuery\n\n if (!secret || token !== secret) {\n return new Response(JSON.stringify({ error: 'Invalid secret' }), {\n status: 401,\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n // Import Next.js revalidatePath (dynamic to avoid hard dep for non-Next consumers)\n let revalidatePath: RevalidatePathFn\n if (options?.revalidatePath) {\n revalidatePath = options.revalidatePath\n } else {\n const nextCache = await import('next/cache')\n revalidatePath = nextCache.revalidatePath\n }\n\n const paths = ['/llms.txt', '/llms-full.txt', ...(options?.extraPaths || [])]\n for (const p of paths) {\n revalidatePath(p)\n }\n\n return new Response(\n JSON.stringify({ revalidated: true, paths }),\n {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n },\n )\n } catch (err) {\n console.error('[site-kit/llms] Revalidation failed:', err)\n return new Response(\n JSON.stringify({ error: 'Revalidation failed' }),\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n )\n }\n }\n}\n"]}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * @sonordev/site-kit — the single source of truth for "is this site's GEO /
3
+ * llms.txt wiring correct". `sonor-setup geo` renders it; nothing else should
4
+ * re-implement it.
5
+ *
6
+ * Split like og/wiring.ts: `readGeoWiring` gathers facts from disk,
7
+ * `judgeGeoWiring` turns them into rows, so the judgement is testable without
8
+ * a filesystem.
9
+ *
10
+ * THE FLEET STANCE, since 2026-09-15:
11
+ *
12
+ * 1. llms.txt is NOT a sitemap entry. An XML sitemap lists indexable HTML
13
+ * pages. llms.txt is a plain-text restatement of those pages, so listing it
14
+ * invites Google to index a thin duplicate of the site. AI crawlers find it
15
+ * by convention at /llms.txt. (heinrich-law-nextjs dropped it in de06cfc,
16
+ * and `geo` still failed the site for it until this rule changed.)
17
+ * 2. llms.txt sends `X-Robots-Tag: noindex`. Crawlers still fetch it; search
18
+ * indexes leave it out. `createLLMsTxtHandler` does this by default. A
19
+ * static `public/llms.txt` is served straight from the CDN and never runs
20
+ * the handler (or next.config `headers()`), so it needs the header in host
21
+ * config: see upforge-nextjs's netlify.toml.
22
+ * 3. Pages advertise it with `Link: <…/llms.txt>; rel="describedby"`. The
23
+ * proxy (`createProxy({ llmsDiscovery })`) is the usual place. The check
24
+ * used to look only at next.config and the root layout, so it failed sites
25
+ * that were sending the header live.
26
+ *
27
+ * Node-only (fs/path): never import from browser or client code.
28
+ */
29
+ export type GeoLevel = 'ok' | 'info' | 'warn' | 'fail';
30
+ export interface GeoRow {
31
+ /** Stable id, safe to key on. */
32
+ id: string;
33
+ label: string;
34
+ level: GeoLevel;
35
+ /** Where it was found, or what's wrong. */
36
+ detail?: string;
37
+ fix?: string;
38
+ }
39
+ export type LlmsUrlPath = '/llms.txt' | '/llms-full.txt';
40
+ export interface LlmsFileFacts {
41
+ path: LlmsUrlPath;
42
+ /** Project-relative route handler file (`app/llms.txt/route.ts`), or null. */
43
+ route: string | null;
44
+ /** The route uses site-kit's handler factory for this file. */
45
+ routeUsesKitHandler: boolean;
46
+ /** The route passes `noindex: false`. */
47
+ routeOptsOutOfNoindex: boolean;
48
+ /** The route sets `X-Robots-Tag: noindex` itself (a hand-rolled handler). */
49
+ routeSetsNoindex: boolean;
50
+ /** `public/<file>` exists, or createSitemap will write it at build. */
51
+ servedStatic: boolean;
52
+ /** Why it counts as static, for the message. */
53
+ staticReason: string | null;
54
+ /** Host config file that sends `X-Robots-Tag: noindex` for this path, or null. */
55
+ hostNoindex: string | null;
56
+ }
57
+ export interface GeoWiringFacts {
58
+ /** Project-relative app dir, or null when the site has none. */
59
+ appDir: string | null;
60
+ llms: LlmsFileFacts[];
61
+ /** Project-relative sitemap route file, or null. */
62
+ sitemap: string | null;
63
+ /** The sitemap lists /llms.txt or /llms-full.txt. */
64
+ sitemapListsLlms: boolean;
65
+ /** Where the `Link: rel="describedby"` discovery header is wired, or null. */
66
+ discovery: string | null;
67
+ }
68
+ /** The host config file that sends `X-Robots-Tag: noindex` for `urlPath`, or null. */
69
+ export declare function findHostNoindex(cwd: string, urlPath: string): string | null;
70
+ /**
71
+ * Where the `Link: rel="describedby"` header for /llms.txt is wired, or null.
72
+ * First match wins, in the order sites actually wire it.
73
+ */
74
+ export declare function findDiscoverySource(cwd: string): string | null;
75
+ /** Read the observable facts. No judgement here — that is `judgeGeoWiring`. */
76
+ export declare function readGeoWiring(cwd: string): GeoWiringFacts;
77
+ /** Turn the facts into rows, in display order. */
78
+ export declare function judgeGeoWiring(facts: GeoWiringFacts): GeoRow[];
79
+ /** Convenience: read + judge in one call. */
80
+ export declare function checkGeoWiring(cwd: string): GeoRow[];
81
+ //# sourceMappingURL=wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring.d.ts","sourceRoot":"","sources":["../../src/llms/wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAYH,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAEtD,MAAM,WAAW,MAAM;IACrB,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,QAAQ,CAAA;IACf,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAA;AAExD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAA;IACjB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,+DAA+D;IAC/D,mBAAmB,EAAE,OAAO,CAAA;IAC5B,yCAAyC;IACzC,qBAAqB,EAAE,OAAO,CAAA;IAC9B,6EAA6E;IAC7E,gBAAgB,EAAE,OAAO,CAAA;IACzB,uEAAuE;IACvE,YAAY,EAAE,OAAO,CAAA;IACrB,gDAAgD;IAChD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,kFAAkF;IAClF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,IAAI,EAAE,aAAa,EAAE,CAAA;IACrB,oDAAoD;IACpD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,qDAAqD;IACrD,gBAAgB,EAAE,OAAO,CAAA;IACzB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAyFD,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ3E;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiC9D;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAoCzD;AAaD,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAiF9D;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wiring.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiring.test.d.ts","sourceRoot":"","sources":["../../src/llms/wiring.test.ts"],"names":[],"mappings":""}
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkQEGUI2Q2_js = require('../chunk-QEGUI2Q2.js');
5
- require('../chunk-HFJQMIFM.js');
6
- require('../chunk-SUZ3ZLB2.js');
4
+ var chunkH65OX263_js = require('../chunk-H65OX263.js');
5
+ require('../chunk-4WBTM6YE.js');
6
+ require('../chunk-5TXXTYXL.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 chunkQEGUI2Q2_js.sonorFetch(
144
+ const res = await chunkH65OX263_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 chunkQEGUI2Q2_js.sonorFetch(
184
+ const res = await chunkH65OX263_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-OFSA7LUH.mjs';
3
- import '../chunk-4XGACM7D.mjs';
4
- import '../chunk-WDBCXRTT.mjs';
2
+ import { sonorFetch } from '../chunk-XLPU3TEE.mjs';
3
+ import '../chunk-ABZGEHTC.mjs';
4
+ import '../chunk-QRBPT6Z6.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';
@@ -27,7 +27,11 @@
27
27
  export interface OgWiringFacts {
28
28
  /** `public/og.png` (or a sibling) exists. */
29
29
  siteCard: boolean;
30
- /** Absolute paths of every `opengraph-image.*` found anywhere under app/. */
30
+ /**
31
+ * Absolute paths of every `opengraph-image.*` / `twitter-image.*` found
32
+ * anywhere under app/: static images AND code-generated cards
33
+ * (`opengraph-image.tsx` and friends). Declared metadata overrides both.
34
+ */
31
35
  pageCards: string[];
32
36
  /** The root layout declares an `images: [...]` array. */
33
37
  layoutDeclaresImages: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"wiring.d.ts","sourceRoot":"","sources":["../../src/og/wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,yDAAyD;IACzD,oBAAoB,EAAE,OAAO,CAAA;IAC7B,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAA;IAClB,uDAAuD;IACvD,eAAe,EAAE,OAAO,CAAA;IACxB,6BAA6B;IAC7B,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAaD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAyBvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,EAAE,CA2CrE;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAE5D"}
1
+ {"version":3,"file":"wiring.d.ts","sourceRoot":"","sources":["../../src/og/wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAMH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,yDAAyD;IACzD,oBAAoB,EAAE,OAAO,CAAA;IAC7B,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAA;IAClB,uDAAuD;IACvD,eAAe,EAAE,OAAO,CAAA;IACxB,6BAA6B;IAC7B,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAYD,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBnD;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAyBvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,EAAE,CAgDrE;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAE5D"}
@@ -5,9 +5,10 @@
5
5
  * Also served on the deprecated `/middleware` subpath. Handles:
6
6
  * - Security headers (CSP frame-ancestors, nosniff, referrer/permissions
7
7
  * policy — deliberately NO X-Frame-Options; see securityHeaders.ts)
8
- * - Portal-managed redirects (legacy hot-path mode; prefer the 404-boundary
9
- * resolver — see the `redirects` option below)
10
- * - Stamps `x-sk-path` on the request so app/not-found.tsx can know the URL
8
+ * - Portal-managed redirects (rule list cached in memory, see the
9
+ * `redirects` option below)
10
+ * - Stamps `x-sk-path` on the request (read by the deprecated not-found
11
+ * resolver; kept so sites still using it don't break)
11
12
  * - Optional before/after hooks for custom logic
12
13
  *
13
14
  * @example
@@ -65,15 +66,19 @@ export interface LlmsDiscoveryConfig {
65
66
  }
66
67
  export interface SiteKitProxyConfig {
67
68
  /**
68
- * Portal-managed redirects on the proxy hot path. Default: true (legacy).
69
+ * Portal-managed redirects, checked before each page render. Default: true,
70
+ * and the recommended setting.
69
71
  *
70
- * LEGACY MODE: this checks rules before EVERY page render — a network
71
- * fetch (now bounded at 300ms, 30s failure cooldown) paid by 100% of
72
- * requests to serve the <1% that would 404. Prefer `redirects: false`
73
- * plus `resolveManagedRedirect()` from
74
- * `@sonordev/site-kit/redirects/not-found` in app/not-found.tsx: same
75
- * instant dashboard behavior, zero cost on successful loads. The proxy
76
- * always stamps `x-sk-path` for it, regardless of this flag.
72
+ * The rule list is cached in memory for `cacheSeconds` (default 300) per
73
+ * instance, and a fetch is bounded at 300ms with a 30s failure cooldown,
74
+ * so page loads rarely wait on it. Set `false` only on a site that uses no
75
+ * Sonor-managed redirects.
76
+ *
77
+ * Don't move redirects into app/not-found.tsx with
78
+ * `resolveManagedRedirect()`. Next renders the root not-found boundary
79
+ * inside every page, and the resolver's headers() call opts every route
80
+ * into dynamic rendering (verified on a Next 16 build: every ○ route became
81
+ * ƒ). That resolver is deprecated.
77
82
  */
78
83
  redirects?: boolean | RedirectConfig;
79
84
  /** Enable security headers. Default: true */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAA;AAO1B,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAA;AAElB,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACpC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAA;IACjD;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAA;IAC3C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,WAAW,KACjB,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACjE;;;OAGG;IACH,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,KACnB,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,kBAAkB,aAe1C,WAAW,KACnB,OAAO,CAAC,YAAY,CAAC,CAwFzB;AAWD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;IACzB,OAAO;CAGR,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,oBAAc,CAAA;AAE3C,4CAA4C;AAC5C,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,mBAAmB,CAAA;AAO1B,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAA;AAElB,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACpC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAA;IACjD;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAA;IAC3C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,CAAA;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,WAAW,KACjB,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACjE;;;OAGG;IACH,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,KACnB,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC1C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,kBAAkB,aAe1C,WAAW,KACnB,OAAO,CAAC,YAAY,CAAC,CAwFzB;AAWD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;IACzB,OAAO;CAGR,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,oBAAc,CAAA;AAE3C,4CAA4C;AAC5C,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAA"}