@sonordev/site-kit 7.1.1 → 7.2.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 (282) hide show
  1. package/AGENTS.md +3 -3
  2. package/CHANGELOG.md +68 -3426
  3. package/README.md +9 -8
  4. package/agent-manifest.json +12 -4
  5. package/dist/{AnalyticsProvider-3MI5RCTL.js → AnalyticsProvider-SLFFBRPE.js} +4 -4
  6. package/dist/{ArticleViewTracker-CMBSJR3N.js → ArticleViewTracker-TM5AMGN2.js} +3 -3
  7. package/dist/{BlocksPopup-X3OAAK2L.js → BlocksPopup-YJNJIVPO.js} +5 -5
  8. package/dist/ChatWidget-XKOSH66S.js +17 -0
  9. package/dist/{FileField-QRSEGO6D.js → FileField-CI4UL5SH.js} +3 -3
  10. package/dist/{FormSpotlight-XKV7VTN4.js → FormSpotlight-F2AAEGBN.js} +20 -6
  11. package/dist/{FormStage-C3YGYAUZ.js → FormStage-BI5R5CNC.js} +27 -7
  12. package/dist/ManagedForm-G6COGHXL.js +16 -0
  13. package/dist/{ManagedNewsletterForm-LPIKGJF4.js → ManagedNewsletterForm-BO3WCGXX.js} +7 -5
  14. package/dist/{SignalCore-ICXXZBYI.js → SignalCore-ZA6WHKBR.js} +3 -3
  15. package/dist/SiteChat-YJADDTKG.js +5 -0
  16. package/dist/{SiteDesignReporter-A7MS2CIP.js → SiteDesignReporter-5YAW36AQ.js} +5 -5
  17. package/dist/SitePopups-ST5PMKZE.js +10 -0
  18. package/dist/SitemapSync-RJTEBINX.js +8 -0
  19. package/dist/SitemapSync.d.ts +1 -1
  20. package/dist/_client/booking-widget.js +5 -5
  21. package/dist/_client/testimonial-section.d.ts +1 -1
  22. package/dist/affiliates/api.d.ts +1 -1
  23. package/dist/affiliates/index.js +3 -3
  24. package/dist/analytics/AnalyticsProvider.d.ts +1 -1
  25. package/dist/analytics/index.js +4 -4
  26. package/dist/analytics/send-gate.d.ts +13 -26
  27. package/dist/articles/Article.d.ts +1 -1
  28. package/dist/articles/ArticleList.d.ts +1 -1
  29. package/dist/articles/ClusterLandingPage.d.ts +2 -2
  30. package/dist/articles/PublicationLayout.d.ts +1 -1
  31. package/dist/articles/PublicationSidebar.d.ts +1 -1
  32. package/dist/articles/RelatedPosts.d.ts +1 -1
  33. package/dist/articles/author-schema.d.ts +1 -1
  34. package/dist/articles/excerpt.d.ts +3 -4
  35. package/dist/articles/index.d.ts +2 -2
  36. package/dist/articles/index.js +2 -2
  37. package/dist/articles/news-sitemap.d.ts +1 -1
  38. package/dist/articles/processArticleHtml.d.ts +1 -1
  39. package/dist/articles/server-core.d.ts +4 -4
  40. package/dist/articles/server-ui.js +3 -2
  41. package/dist/articles/server.d.ts +4 -4
  42. package/dist/articles/server.js +2 -1
  43. package/dist/articles/types.d.ts +1 -1
  44. package/dist/{engage → chat}/ChatWidget.d.ts +8 -7
  45. package/dist/{engage → chat}/EchoUiActions.d.ts +4 -4
  46. package/dist/chat/SiteChat.d.ts +25 -0
  47. package/dist/{engage → chat}/brand-color.d.ts +2 -2
  48. package/dist/{engage → chat}/chat-messages.d.ts +1 -1
  49. package/dist/{engage → chat}/echo-config.d.ts +1 -1
  50. package/dist/chat/index.d.ts +10 -6
  51. package/dist/chat/index.js +14 -8
  52. package/dist/{engage → chat}/launcher-placement.d.ts +1 -7
  53. package/dist/{engage → chat}/socket-loader.d.ts +2 -2
  54. package/dist/chat/types.d.ts +136 -0
  55. package/dist/chunk-27FISYK4.js +4 -0
  56. package/dist/{chunk-QPEEKFCA.js → chunk-4NTBQNHA.js} +249 -80
  57. package/dist/{chunk-RK7GF7PQ.js → chunk-5V2V5C3Y.js} +2 -4
  58. package/dist/{chunk-ICFRH2ED.js → chunk-5YCEMV2L.js} +1 -1
  59. package/dist/{chunk-V4HUSHZO.js → chunk-64DKGVEI.js} +41 -7
  60. package/dist/{chunk-GLHQ3LRO.js → chunk-6U3VLV2C.js} +1 -1
  61. package/dist/{chunk-ZETJTCMV.js → chunk-BC4Y3S3D.js} +1 -1
  62. package/dist/{chunk-JSZN6LDZ.js → chunk-BF7TZYC3.js} +38 -31
  63. package/dist/{chunk-EFPS56JA.js → chunk-BKY2ZNM7.js} +1 -1
  64. package/dist/{chunk-AQSNPZY4.js → chunk-C2FZBUSS.js} +80 -1
  65. package/dist/{chunk-H42PZKVC.js → chunk-CF5QNFYU.js} +2 -2
  66. package/dist/{chunk-JC7KXNNM.js → chunk-D5DCBD4Y.js} +2 -2
  67. package/dist/{chunk-PXZ7LAOY.js → chunk-D6ZC7XKZ.js} +2 -2
  68. package/dist/chunk-EJVQJCG5.js +370 -0
  69. package/dist/{chunk-6OL23QYD.js → chunk-F24FNCTK.js} +1 -1
  70. package/dist/{chunk-NEKEH4CK.js → chunk-FR6BYFPC.js} +53 -21
  71. package/dist/{chunk-KOPVJQ2P.js → chunk-GEXT7BTE.js} +1 -1
  72. package/dist/{chunk-ZAWANWUS.js → chunk-GGORNBSC.js} +18 -6
  73. package/dist/{chunk-DUQMSNF2.js → chunk-HGFAEDG3.js} +1 -1
  74. package/dist/chunk-HODO5BX5.js +28 -0
  75. package/dist/chunk-HW7B43E5.js +14 -0
  76. package/dist/{chunk-EQBZ24VH.js → chunk-IAM3D3RL.js} +43 -24
  77. package/dist/{chunk-ODADQM6Z.js → chunk-JJ3DELUL.js} +2 -2
  78. package/dist/{chunk-542MIHNP.js → chunk-JMLK6MH7.js} +1 -1
  79. package/dist/{chunk-7FWA3I6A.js → chunk-JWTQS5F5.js} +1 -1
  80. package/dist/{chunk-OUNRFXDC.js → chunk-K4ZHAURD.js} +1 -1
  81. package/dist/chunk-NV72HZ4W.js +45 -0
  82. package/dist/{chunk-4Y5FWDPM.js → chunk-NZ4RXN3G.js} +55 -7
  83. package/dist/chunk-OWZ7ATLZ.js +187 -0
  84. package/dist/{chunk-TXBAOEKG.js → chunk-PKGN32AU.js} +5 -4
  85. package/dist/chunk-Q6E4OPGG.js +40 -0
  86. package/dist/{chunk-J4D6ZXRW.js → chunk-QL6XNPSD.js} +3 -3
  87. package/dist/{chunk-HAG4YIZY.js → chunk-R46IQIGK.js} +6 -6
  88. package/dist/{chunk-R3VKF43H.js → chunk-RPZ7OQGD.js} +1 -1
  89. package/dist/{chunk-Q3S26EQA.js → chunk-S54ECQGY.js} +1 -1
  90. package/dist/{chunk-JIL5VY2R.js → chunk-VHKEF5ZB.js} +1 -1
  91. package/dist/{chunk-ILAW3XKD.js → chunk-VO3JYRT5.js} +43 -29
  92. package/dist/chunk-VWWITFWM.js +300 -0
  93. package/dist/{chunk-OPRBF7VE.js → chunk-ZTLMPUO6.js} +3 -2
  94. package/dist/client/index.js +3 -3
  95. package/dist/cms/CmsPreview.d.ts +2 -2
  96. package/dist/cms/index.d.ts +3 -3
  97. package/dist/cms/server-api.d.ts +1 -1
  98. package/dist/cms/types.d.ts +1 -1
  99. package/dist/commerce/EventCheckout.d.ts +1 -1
  100. package/dist/commerce/EventsAgenda.d.ts +3 -3
  101. package/dist/commerce/api.d.ts +1 -1
  102. package/dist/commerce/index.js +4 -4
  103. package/dist/commerce/server.d.ts +3 -4
  104. package/dist/contracts/color.d.ts +1 -1
  105. package/dist/contracts/entries.d.ts +1 -1
  106. package/dist/contracts/error-page.d.ts +183 -0
  107. package/dist/contracts/fleet.d.ts +9 -9
  108. package/dist/contracts/forms.d.ts +4 -10
  109. package/dist/contracts/llms.d.ts +2 -1
  110. package/dist/contracts/portfolio.d.ts +11 -15
  111. package/dist/contracts/proposal-sitemap.d.ts +130 -0
  112. package/dist/contracts/schema-placeholders.d.ts +87 -0
  113. package/dist/contracts/seo-meta.d.ts +11 -12
  114. package/dist/contracts/seo-pages.d.ts +12 -18
  115. package/dist/contracts/site-cache.d.ts +4 -4
  116. package/dist/contracts/sites-normalize.d.ts +2 -4
  117. package/dist/contracts/sites.d.ts +3 -5
  118. package/dist/contracts/slot-content.d.ts +2 -2
  119. package/dist/contracts/slots.d.ts +6 -6
  120. package/dist/contracts/voice.d.ts +56 -0
  121. package/dist/contracts/website.d.ts +2 -2
  122. package/dist/engage/EngageWidget.d.ts +13 -12
  123. package/dist/engage/index.d.ts +10 -9
  124. package/dist/engage/index.js +31 -35
  125. package/dist/engage/types.d.ts +19 -244
  126. package/dist/fleet/FleetHeartbeat.d.ts +2 -2
  127. package/dist/fleet/index.js +4 -4
  128. package/dist/forms/FormEnhancer.d.ts +25 -12
  129. package/dist/forms/FormSpotlight.d.ts +2 -2
  130. package/dist/forms/ManagedForm.d.ts +1 -1
  131. package/dist/forms/ServerForm.d.ts +11 -10
  132. package/dist/forms/StaticForm.d.ts +4 -2
  133. package/dist/forms/field-autocomplete.d.ts +28 -0
  134. package/dist/forms/field-interactions.d.ts +2 -2
  135. package/dist/forms/form-dom-values.d.ts +42 -0
  136. package/dist/forms/form-loaded-at.d.ts +2 -2
  137. package/dist/forms/formsApi.d.ts +2 -2
  138. package/dist/forms/index.d.ts +1 -1
  139. package/dist/forms/index.js +11 -9
  140. package/dist/forms/server.d.ts +1 -1
  141. package/dist/forms/server.js +6 -4
  142. package/dist/forms/static.js +3 -2
  143. package/dist/forms/submitForm.d.ts +9 -2
  144. package/dist/forms/types.d.ts +44 -5
  145. package/dist/forms/useForm.d.ts +21 -4
  146. package/dist/forms/webmcp.d.ts +38 -0
  147. package/dist/images/ManagedFavicon.d.ts +1 -1
  148. package/dist/images/ManagedImage.d.ts +4 -4
  149. package/dist/images/api.d.ts +1 -1
  150. package/dist/images/index.d.ts +2 -2
  151. package/dist/images/index.js +4 -4
  152. package/dist/index.d.ts +4 -1
  153. package/dist/index.js +1 -1
  154. package/dist/landing/contract.d.ts +3 -4
  155. package/dist/layout/SiteKitClientProviders.d.ts +4 -4
  156. package/dist/layout/SiteKitLayout.d.ts +11 -11
  157. package/dist/layout/client.d.ts +4 -4
  158. package/dist/layout/client.js +7 -7
  159. package/dist/layout/index.js +8 -8
  160. package/dist/layout/types.d.ts +7 -6
  161. package/dist/llms/SpeakableSchema.d.ts +2 -2
  162. package/dist/llms/agent-access.d.ts +2 -2
  163. package/dist/llms/aiRobots.d.ts +4 -4
  164. package/dist/llms/api.d.ts +2 -2
  165. package/dist/llms/contract.js +1 -1
  166. package/dist/llms/generateLLMsTxt.d.ts +1 -1
  167. package/dist/llms/index.js +6 -6
  168. package/dist/llms/links.d.ts +1 -1
  169. package/dist/llms/revalidate.d.ts +1 -1
  170. package/dist/llms/seo-revalidate.d.ts +2 -3
  171. package/dist/llms/types.d.ts +6 -6
  172. package/dist/llms/writeLLMsTxt.d.ts +10 -10
  173. package/dist/manifest/index.d.ts +8 -8
  174. package/dist/maps/index.js +3 -3
  175. package/dist/mcp/WebMcpTools.d.ts +1 -1
  176. package/dist/mcp/index.js +2 -14
  177. package/dist/mcp/report.d.ts +2 -2
  178. package/dist/mcp/serverCard.d.ts +1 -1
  179. package/dist/mcp/sonor.d.ts +5 -6
  180. package/dist/mcp/sonor.js +14 -11
  181. package/dist/mcp/transport.d.ts +1 -2
  182. package/dist/mcp/types.d.ts +4 -5
  183. package/dist/motion/engine.d.ts +2 -3
  184. package/dist/motion/failsafe.d.ts +1 -2
  185. package/dist/motion/gsap.d.ts +2 -2
  186. package/dist/motion/three.d.ts +1 -1
  187. package/dist/og/config.d.ts +4 -4
  188. package/dist/og/contrast.d.ts +2 -2
  189. package/dist/og/pages.d.ts +5 -5
  190. package/dist/og/route-fit.d.ts +2 -2
  191. package/dist/og/route.d.ts +1 -2
  192. package/dist/og/template.d.ts +1 -1
  193. package/dist/proxy/index.d.ts +2 -2
  194. package/dist/proxy/securityHeaders.d.ts +10 -12
  195. package/dist/redirects/index.d.ts +7 -7
  196. package/dist/reputation/TestimonialSection.d.ts +1 -1
  197. package/dist/reputation/api.d.ts +1 -1
  198. package/dist/revalidate/index.js +2 -2
  199. package/dist/robots/index.d.ts +5 -5
  200. package/dist/robots/indexnow.d.ts +2 -3
  201. package/dist/seo/ManagedScripts.d.ts +2 -2
  202. package/dist/seo/client.js +4 -4
  203. package/dist/seo/getManagedMetadata.d.ts +1 -1
  204. package/dist/seo/groundingSchema.d.ts +2 -2
  205. package/dist/seo/index.js +15 -8
  206. package/dist/seo/llms/contract.js +1 -1
  207. package/dist/seo/llms.js +6 -6
  208. package/dist/seo/register-sitemap-cli-impl.d.ts +1 -1
  209. package/dist/seo/register-sitemap-cli.d.ts +1 -1
  210. package/dist/seo/register-sitemap-cli.js +2 -2
  211. package/dist/seo/schema-filter.d.ts +5 -6
  212. package/dist/seo/server-api.d.ts +1 -1
  213. package/dist/seo/sitemap.js +4 -4
  214. package/dist/seo/types.d.ts +4 -4
  215. package/dist/seo/withManagedMetadata.d.ts +4 -4
  216. package/dist/server/index.js +2 -2
  217. package/dist/server/mint-site-token.d.ts +1 -2
  218. package/dist/server/server-fetch.d.ts +5 -5
  219. package/dist/shared/build-entries.d.ts +4 -4
  220. package/dist/shared/dialog.d.ts +27 -0
  221. package/dist/shared/frame.d.ts +8 -9
  222. package/dist/shared/fresh-fetch.d.ts +1 -2
  223. package/dist/shared/identity.d.ts +1 -1
  224. package/dist/shared/layers.d.ts +7 -0
  225. package/dist/shared/mid-form.d.ts +53 -0
  226. package/dist/shared/next-files.d.ts +1 -1
  227. package/dist/shared/publishCredential.d.ts +1 -1
  228. package/dist/shared/reporting-gate.d.ts +1 -1
  229. package/dist/shared/uuid.d.ts +1 -2
  230. package/dist/shared/version.d.ts +1 -1
  231. package/dist/shared/visual-viewport-gap.d.ts +3 -3
  232. package/dist/signal/index.js +2 -2
  233. package/dist/signal/types.d.ts +1 -1
  234. package/dist/site-config/index.d.ts +2 -2
  235. package/dist/sitemap/index.d.ts +13 -13
  236. package/dist/sitemap/index.js +4 -4
  237. package/dist/sitemap/shared.d.ts +3 -3
  238. package/dist/sites/site-param.d.ts +2 -2
  239. package/dist/slots/ManagedRichText.d.ts +1 -1
  240. package/dist/slots/ManagedSlot.d.ts +1 -1
  241. package/dist/slots/index.d.ts +1 -3
  242. package/dist/{socket-loader-R24ZSRSQ.js → socket-loader-CGIPEG74.js} +1 -1
  243. package/dist/sync/index.js +5 -5
  244. package/dist/types.d.ts +4 -2
  245. package/dist/website/BlocksPopup.d.ts +1 -1
  246. package/dist/website/PopupBlocks.d.ts +8 -6
  247. package/dist/website/SitePopups.d.ts +25 -0
  248. package/dist/website/images.js +4 -4
  249. package/dist/website/index.js +6 -6
  250. package/dist/website/popup-rules.d.ts +46 -0
  251. package/dist/website/popup-types.d.ts +113 -0
  252. package/dist/website/popups.d.ts +2 -6
  253. package/dist/website/popups.js +6 -14
  254. package/dist/{writeLLMsTxt-QR23OQUE.js → writeLLMsTxt-OV24LQVL.js} +3 -3
  255. package/docs/MIGRATING-TO-7.md +50 -22
  256. package/docs.json +2 -1
  257. package/package.json +2 -2
  258. package/src/admin-auth/README.md +3 -3
  259. package/src/analytics/README.md +9 -11
  260. package/src/articles/README.md +10 -7
  261. package/src/{engage → chat}/README.md +63 -62
  262. package/src/cta-bar/README.md +11 -11
  263. package/src/forms/README.md +60 -12
  264. package/src/layout/README.md +8 -5
  265. package/src/llms/README.md +3 -3
  266. package/src/mcp/README.md +7 -7
  267. package/src/motion/README.md +1 -1
  268. package/src/og/README.md +26 -27
  269. package/src/proxy/README.md +14 -14
  270. package/src/seo/README.md +4 -2
  271. package/src/slots/README.md +1 -1
  272. package/src/sync/README.md +10 -0
  273. package/src/website/README.md +133 -0
  274. package/dist/ChatWidget-JMFBXJ75.js +0 -15
  275. package/dist/EngageWidget-A3QKZ3SU.js +0 -11
  276. package/dist/ManagedForm-2GSSDJPP.js +0 -14
  277. package/dist/SitemapSync-4U654SEA.js +0 -8
  278. package/dist/chunk-B73QPZPH.js +0 -837
  279. package/dist/chunk-NDF4A5JM.js +0 -37
  280. package/dist/chunk-RTMMHTEQ.js +0 -100
  281. package/dist/engage/DesignRenderer.d.ts +0 -57
  282. package/dist/engage/element-rules.d.ts +0 -38
@@ -24,17 +24,24 @@ export interface SubmitFormArgs {
24
24
  honeypotValue: string;
25
25
  /** Timestamp (ms) the form was first rendered — a weak anti-bot timing signal. */
26
26
  formLoadedAt: number;
27
+ /**
28
+ * The browser reported that an AI agent pressed submit (WebMCP's
29
+ * `SubmitEvent.agentInvoked`). Sent so Sonor can tag the lead for the
30
+ * business; it is the browser's word, so it never changes how the
31
+ * submission is checked.
32
+ */
33
+ agentInvoked?: boolean;
27
34
  }
28
35
  /**
29
36
  * Submit a managed form. Throws on failure (network, timeout, or a non-2xx
30
37
  * response) with a human-readable message; resolves with the parsed API
31
38
  * response on success.
32
39
  */
33
- export declare function submitForm({ config, values, honeypotValue, formLoadedAt, }: SubmitFormArgs): Promise<FormSubmitResult>;
40
+ export declare function submitForm({ config, values, honeypotValue, formLoadedAt, agentInvoked, }: SubmitFormArgs): Promise<FormSubmitResult>;
34
41
  /**
35
42
  * The receipt Sonor returns plus the values that were sent. `onSuccess`
36
43
  * callers need the values (free-audit reads the website and email back), and
37
- * the receipt alone never carried them: upforge.io's free-audit handler read
44
+ * the receipt alone never carried them: a site's free-audit handler read
38
45
  * `submission.data`, always got undefined, and sent its audit request with no
39
46
  * email or URL.
40
47
  */
@@ -88,7 +88,7 @@ export interface FormField {
88
88
  destination_field?: string;
89
89
  /**
90
90
  * What the form says back once this field's row is answered, replacing the
91
- * built-in sentence ("Nice to meet you, Ramsey."). Set per field in Sonor;
91
+ * built-in sentence ("Nice to meet you, Jordan."). Set per field in Sonor;
92
92
  * the first field in a row that defines one wins. Supports tokens:
93
93
  * `{value}` (this field's answer), `{label}`, `{first_name}`, and
94
94
  * `{slug}` for any other field's answer, e.g.
@@ -127,6 +127,45 @@ export interface ConditionalLogic {
127
127
  * on purpose (a bot must not learn it was caught), so nothing here says
128
128
  * whether the lead was accepted, routed or scored.
129
129
  */
130
+ /**
131
+ * Options for a managed form's `submit()`. All optional; `submit()` with no
132
+ * argument behaves exactly as it always has.
133
+ */
134
+ export interface FormSubmitOptions {
135
+ /**
136
+ * The browser reported that an AI agent pressed submit (WebMCP's
137
+ * `SubmitEvent.agentInvoked`). Sonor tags the lead so the business can see
138
+ * how agent-sent leads compare; it changes nothing else about the submit.
139
+ */
140
+ agentInvoked?: boolean;
141
+ /**
142
+ * Values found in the form's controls that React state never received (a
143
+ * control set without an input event). Merged over blank state values
144
+ * before validating. See form-dom-values.ts.
145
+ */
146
+ domFills?: Record<string, unknown>;
147
+ }
148
+ /**
149
+ * What `submit()` resolves with. Callers that ignore it keep working; an
150
+ * agent that submitted through WebMCP is handed this as its result.
151
+ */
152
+ export type FormSubmitOutcome = {
153
+ status: 'sent';
154
+ message: string;
155
+ submissionId?: string;
156
+ } | {
157
+ status: 'invalid';
158
+ errors: Record<string, string>;
159
+ } | {
160
+ status: 'failed';
161
+ message: string;
162
+ } | {
163
+ status: 'busy';
164
+ } | {
165
+ status: 'next_step';
166
+ step: number;
167
+ totalSteps: number;
168
+ };
130
169
  export interface FormSubmitResult {
131
170
  success: boolean;
132
171
  /** The form_submissions row id (same as submissionId). */
@@ -166,7 +205,7 @@ export interface FormAnalytics {
166
205
  * - 'spotlight' — THE 4.0 DEFAULT. The classic layout, alive: a glowing ring
167
206
  * visits the active field, and each completed row collapses
168
207
  * into a sentence the form says back ("Nice to meet you,
169
- * Ramsey.") with an edit affordance to reopen it.
208
+ * Jordan.") with an edit affordance to reopen it.
170
209
  * - 'stage' — accordion: beats expand/collapse on one surface, answered
171
210
  * beats settle into filled rows
172
211
  * - 'classic' — the plain grid form, no choreography
@@ -197,7 +236,7 @@ export interface ExperienceRenderProps {
197
236
  isFieldVisible: (field: FormField) => boolean;
198
237
  fieldIsComplete: (field: FormField) => boolean;
199
238
  applyFieldError: (slug: string, error: string) => void;
200
- submit: () => Promise<void>;
239
+ submit: (options?: FormSubmitOptions) => Promise<FormSubmitOutcome>;
201
240
  trackStepChange: (step: number) => void;
202
241
  /** Pass to each FormField's onFocus/onBlur (field_interactions). */
203
242
  trackFieldFocus: (slug: string) => void;
@@ -206,7 +245,7 @@ export interface ExperienceRenderProps {
206
245
  honeypot: React.ReactNode;
207
246
  }
208
247
  export interface ManagedFormProps {
209
- /** Form key from Portal */
248
+ /** Form key from Sonor */
210
249
  formId: string;
211
250
  /** @deprecated Project is resolved from API key by the backend. Omit this prop. */
212
251
  projectId?: string;
@@ -269,7 +308,7 @@ export interface FormRenderProps {
269
308
  /** Go to specific step */
270
309
  goToStep: (step: number) => void;
271
310
  /** Submit the form */
272
- submit: () => Promise<void>;
311
+ submit: (options?: FormSubmitOptions) => Promise<FormSubmitOutcome>;
273
312
  /** Set field value */
274
313
  setFieldValue: (key: string, value: unknown) => void;
275
314
  /** Check if field should be visible (conditional logic) */
@@ -9,7 +9,7 @@
9
9
  * const { form, fields, values, errors, setFieldValue, submit, isSubmitting } = useForm('contact-form')
10
10
  *
11
11
  * return (
12
- * <form onSubmit={(e) => { e.preventDefault(); submit() }}>
12
+ * <form {...toolAttributes} onSubmit={handleSubmit}>
13
13
  * {fields.map(field => (
14
14
  * <MyCustomInput
15
15
  * key={field.slug}
@@ -24,7 +24,9 @@
24
24
  * )
25
25
  * ```
26
26
  */
27
- import type { ManagedFormConfig, FormField, FormSubmitResult } from './types';
27
+ import type { DeclarativeToolFormAttributes } from '../mcp/declarative';
28
+ import type { FormEvent } from 'react';
29
+ import type { ManagedFormConfig, FormField, FormSubmitOptions, FormSubmitOutcome, FormSubmitResult } from './types';
28
30
  export interface UseFormOptions {
29
31
  /** Project ID (defaults to SiteKitLayout config) */
30
32
  projectId?: string;
@@ -98,8 +100,23 @@ export interface UseFormReturn {
98
100
  validateField: (field: FormField) => string | null;
99
101
  /** Check if a field is visible (conditional logic) */
100
102
  isFieldVisible: (field: FormField) => boolean;
101
- /** Submit the form */
102
- submit: () => Promise<void>;
103
+ /**
104
+ * Submit the form. Resolves with what happened (sent, invalid, failed,
105
+ * busy); ignoring the result is fine.
106
+ */
107
+ submit: (options?: FormSubmitOptions) => Promise<FormSubmitOutcome>;
108
+ /**
109
+ * A ready-made `<form onSubmit>`: prevents the native submit, moves to the
110
+ * next step or submits, and hands an AI agent that submitted through
111
+ * WebMCP the outcome. Prefer it to calling `submit()` yourself.
112
+ */
113
+ handleSubmit: (event: FormEvent<HTMLFormElement>) => void;
114
+ /**
115
+ * WebMCP attributes for your `<form>` (`toolname`, `tooldescription`), so
116
+ * a browser agent can fill it as a tool. Spread them on the form element.
117
+ * Null until the form config loads.
118
+ */
119
+ toolAttributes: DeclarativeToolFormAttributes | null;
103
120
  /** Submission state */
104
121
  isSubmitting: boolean;
105
122
  isComplete: boolean;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @sonordev/site-kit/forms - managed forms as WebMCP tools
3
+ *
4
+ * Every managed form carries the declarative WebMCP attributes (`toolname`,
5
+ * `tooldescription`), so a browser agent can treat it as a tool: it fills the
6
+ * same controls a person would and the submit runs the same validation and
7
+ * files the same lead. There is deliberately no `toolautosubmit`. The agent
8
+ * fills the fields and the person it's helping presses Send, which is the
9
+ * right default for anything that files a lead or sends a message.
10
+ *
11
+ * Browsers that don't implement WebMCP ignore the attributes. Each field's
12
+ * label is what an agent reads to understand it (FormField adds the help
13
+ * text as `toolparamdescription` where there is some).
14
+ *
15
+ * Single source of truth for a managed form's tool name and description, and
16
+ * for reading an agent's submit (`SubmitEvent.agentInvoked`, `respondWith`).
17
+ * FormClient, FormSpotlight, FormStage, StaticForm and useForm all use it.
18
+ */
19
+ import { type DeclarativeToolFormAttributes } from '../mcp/declarative';
20
+ import type { ManagedFormConfig } from './types';
21
+ /** `contact-page` -> `submit_contact_page`. Stable, snake_case, unique per form. */
22
+ export declare function formToolName(config: Pick<ManagedFormConfig, 'slug'>): string;
23
+ /** The tool description an agent reads to decide whether this form is the one. */
24
+ export declare function formToolDescription(config: Pick<ManagedFormConfig, 'name' | 'form_type' | 'description'>): string;
25
+ /** Spread onto the managed form's `<form>` element. */
26
+ export declare function formToolAttributes(config: Pick<ManagedFormConfig, 'slug' | 'name' | 'form_type' | 'description'>): DeclarativeToolFormAttributes;
27
+ export interface AgentSubmit {
28
+ /** True when the browser reports that an AI agent submitted the form. */
29
+ invoked: boolean;
30
+ /**
31
+ * Hand the agent the outcome of its submit. Call it synchronously inside
32
+ * the submit handler, after `preventDefault()`. A no-op unless an agent
33
+ * submitted and the browser supports `respondWith`.
34
+ */
35
+ respond: (outcome: Promise<unknown>) => void;
36
+ }
37
+ /** Read an agent's submit off a native SubmitEvent (`e.nativeEvent` in React). */
38
+ export declare function readAgentSubmit(event: Event | null | undefined): AgentSubmit;
@@ -30,7 +30,7 @@
30
30
  import React from 'react';
31
31
  export interface ManagedFaviconProps {
32
32
  /**
33
- * API key for Portal API authentication
33
+ * API key for Sonor API authentication
34
34
  * Defaults to SONOR_API_KEY env var
35
35
  */
36
36
  apiKey?: string;
@@ -1,8 +1,8 @@
1
1
  /**
2
- * ManagedImage - Portal-managed image component
2
+ * ManagedImage - Sonor-managed image component
3
3
  *
4
4
  * Features:
5
- * - Fetches images from Portal API via API key (never direct Supabase)
5
+ * - Fetches images from Sonor API via API key (never direct Supabase)
6
6
  * - Dev mode: Click to open image picker modal
7
7
  * - Supports responsive variants
8
8
  * - Automatic focal point handling
@@ -43,7 +43,7 @@ export interface ImageFile {
43
43
  public_url?: string;
44
44
  }
45
45
  export interface ManagedImageProps {
46
- /** API key for Portal API */
46
+ /** API key for Sonor API */
47
47
  apiKey?: string;
48
48
  /** API URL (defaults to https://api.sonor.io) */
49
49
  apiUrl?: string;
@@ -51,7 +51,7 @@ export interface ManagedImageProps {
51
51
  slotId: string;
52
52
  /** Page path for page-specific slots (defaults to current path) */
53
53
  pagePath?: string;
54
- /** Fallback alt text if not set in Portal */
54
+ /** Fallback alt text if not set in Sonor */
55
55
  alt?: string;
56
56
  /** CSS class names */
57
57
  className?: string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Images API functions
3
3
  *
4
- * All functions use Portal API with API key authentication.
4
+ * All functions use Sonor API with API key authentication.
5
5
  * Never makes direct Supabase calls.
6
6
  */
7
7
  import type { ManagedImageData, ImageFile } from './ManagedImage';
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @sonordev/site-kit Images Module
3
3
  *
4
- * Provides managed image components for Portal integration.
5
- * All API calls go through Portal API with API key auth.
4
+ * Provides managed image components for Sonor integration.
5
+ * All API calls go through Sonor API with API key auth.
6
6
  */
7
7
  export { ManagedImage } from './ManagedImage';
8
8
  export type { ManagedImageProps, ManagedImageData, ImageFile } from './ManagedImage';
@@ -1,6 +1,6 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-542MIHNP.js';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-JMLK6MH7.js';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-GW7GSBO7.js';
3
- import '../chunk-PXZ7LAOY.js';
4
- import '../chunk-OUNRFXDC.js';
5
- import '../chunk-6OL23QYD.js';
3
+ import '../chunk-D6ZC7XKZ.js';
4
+ import '../chunk-K4ZHAURD.js';
5
+ import '../chunk-F24FNCTK.js';
6
6
  import '../chunk-PKBMQBKP.js';
package/dist/index.d.ts CHANGED
@@ -15,7 +15,10 @@
15
15
  export { SITE_KIT_VERSION } from './shared/version';
16
16
  export type { ManagedMetadataResult, ManagedSchemaProps, ManagedFAQData } from './seo/types';
17
17
  export type { AnalyticsConfig, AnalyticsEvent, PageView } from './analytics/types';
18
- export type { EngageElement, WidgetConfig, ChatConfig } from './engage/types';
18
+ export type { ChatConfig } from './chat/types';
19
+ export type { SitePopup } from './website/popup-types';
20
+ /** Deprecated names (engage was retired): SitePopup and SitePopupConfig. */
21
+ export type { EngageElement, WidgetConfig } from './engage/types';
19
22
  export type { ManagedFormConfig, FormSubmission, FormSubmitResult, FormField } from './forms/types';
20
23
  export type { Article as ArticleType, ArticleAuthor, ArticleCategory } from './articles/types';
21
24
  export type { CommerceOffering, CommerceCategory, CommerceVariant, CommerceSchedule, OfferingType, Cart, CartItem, } from './commerce/types';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { SITE_KIT_VERSION } from './chunk-6OL23QYD.js';
1
+ export { SITE_KIT_VERSION } from './chunk-F24FNCTK.js';
2
2
  import './chunk-PKBMQBKP.js';
@@ -1,10 +1,9 @@
1
1
  /**
2
2
  * Landing-page campaign contract.
3
3
  *
4
- * normalizeCampaignSlug is an inlined MIRROR of sonor-api's
5
- * `src/modules/analytics/utils/campaign.util.ts` (the CANONICAL copy) —
6
- * keep the function body byte-identical. Both suites assert the same fixed
7
- * vectors (sonor-api's campaign.util.spec.ts and this package's
4
+ * normalizeCampaignSlug is an inlined MIRROR of the Sonor API's campaign
5
+ * normalizer (the CANONICAL copy); keep the function body byte-identical.
6
+ * Both sides assert the same fixed vectors (this package's
8
7
  * landing/contract.test.ts), so silent drift fails CI on either side.
9
8
  *
10
9
  * A slug normalized here always matches the server's canonical form, so the
@@ -2,7 +2,7 @@
2
2
  * SiteKitClientProviders — Client Island
3
3
  *
4
4
  * This is the 'use client' boundary for SiteKitLayout.
5
- * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)
5
+ * It composes the client-only providers (Analytics, chat, popups, Signal, SitemapSync)
6
6
  * that require React context or browser APIs.
7
7
  *
8
8
  * All modules are lazy-loaded via next/dynamic so their JS is only downloaded
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * All modules share a unified identity (visitor ID + session ID) read from
12
12
  * the storage-backed singleton (shared/identity), ensuring consistent
13
- * tracking across Analytics, Signal, and Engage.
13
+ * tracking across Analytics, Signal, chat and popups.
14
14
  *
15
15
  * 4.0 INVARIANT — CHILDREN ARE NEVER WRAPPED. Every module here renders as a
16
16
  * childless sibling AFTER {children}; nothing provides context around page
@@ -37,7 +37,7 @@ export interface SiteKitClientProvidersProps {
37
37
  signal?: boolean | SignalConfig;
38
38
  /**
39
39
  * Runtime SitemapSync from the visitor's browser. Default FALSE — sitemap
40
- * registration belongs to build time and to sonor-api's nightly reconciler,
40
+ * registration belongs to build time and to Sonor's nightly reconciler,
41
41
  * not to whoever happens to load the page. See SiteKitLayout for the full
42
42
  * reasoning; in short, its guards live in session/localStorage, so every new
43
43
  * visitor missed them and re-POSTed the whole sitemap.
@@ -56,7 +56,7 @@ export interface SiteKitClientProvidersProps {
56
56
  */
57
57
  design?: boolean | DesignConfig;
58
58
  /**
59
- * Defer Analytics / Engage / SitemapSync until window load + idle or first
59
+ * Defer Analytics / chat / popups / SitemapSync until window load + idle or first
60
60
  * interaction (default true). Pass false to restore legacy eager mounting
61
61
  * on hydration. SignalBridge is never deferred — it must apply experiment
62
62
  * variants as early as possible.
@@ -5,15 +5,15 @@
5
5
  * site-kit feature your layout needs:
6
6
  *
7
7
  * Server-side (RSC):
8
- * - ManagedFavicon (link tags from Portal logo)
8
+ * - ManagedFavicon (link tags from the project logo in Sonor)
9
9
  * - ManagedScripts position="head" (tracking pixels, analytics tags)
10
10
  * - ManagedScripts position="body-end"
11
11
  *
12
12
  * Client-side (island):
13
13
  * - AnalyticsProvider (page views, scroll depth, heatmap, web vitals)
14
- * - EngageWidget (popups, nudges, chat)
14
+ * - SitePopups (Website → Popups & Banners) and SiteChat (Website chat)
15
15
  * - SignalBridge (A/B experiments, behavior tracking)
16
- * - SitemapSync (keeps Portal seo_pages in sync)
16
+ * - SitemapSync (keeps Sonor seo_pages in sync)
17
17
  *
18
18
  * @example
19
19
  * ```tsx
@@ -37,7 +37,7 @@
37
37
  *
38
38
  * @example Opt out of specific features:
39
39
  * ```tsx
40
- * <SiteKitLayout engage={false} signal={false}>
40
+ * <SiteKitLayout chat={false} popups={false} signal={false}>
41
41
  * {children}
42
42
  * </SiteKitLayout>
43
43
  * ```
@@ -46,11 +46,11 @@ import * as React from 'react';
46
46
  import type { AnalyticsConfig, ChatLayoutConfig, DesignConfig, EngageConfig, SignalConfig } from './types';
47
47
  export interface SiteKitLayoutProps {
48
48
  children: React.ReactNode;
49
- /** Portal API key. Defaults to SONOR_API_KEY env var. */
49
+ /** Sonor API key. Defaults to SONOR_API_KEY env var. */
50
50
  apiKey?: string;
51
- /** Portal API URL. Defaults to env or https://api.sonor.io */
51
+ /** Sonor API URL. Defaults to env or https://api.sonor.io */
52
52
  apiUrl?: string;
53
- /** Project ID (for Engage chat room routing). Auto-resolved if not provided. */
53
+ /** Project ID (for chat routing). Auto-resolved if not provided. */
54
54
  projectId?: string;
55
55
  /** Analytics tracking. true (default) | false | config object */
56
56
  analytics?: boolean | AnalyticsConfig;
@@ -69,13 +69,13 @@ export interface SiteKitLayoutProps {
69
69
  * Runtime SitemapSync from the visitor's browser. **Default: false.**
70
70
  *
71
71
  * Sitemap registration is a build-time and server-side job. Build-time
72
- * `createSitemap` is canonical, and sonor-api's nightly reconciler fetches
72
+ * `createSitemap` is canonical, and Sonor's nightly reconciler fetches
73
73
  * each host's /sitemap.xml itself, so nothing here needs a visitor.
74
74
  *
75
75
  * This defaulted to true, and because its throttle lives in sessionStorage
76
76
  * and its content hash in localStorage, every first-time visitor, incognito
77
- * tab and crawler missed both guards and re-POSTed the entire sitemap:
78
- * upforge.io took ~140 full syncs in a day, queencityriverboats.com ~76.
77
+ * tab and crawler missed both guards and re-POSTed the entire sitemap, so
78
+ * a busy site took well over a hundred full syncs a day.
79
79
  * That coupled sitemap traffic to VISITOR COUNT rather than to content
80
80
  * changes — exactly backwards — and made every reader pay for platform
81
81
  * bookkeeping in bandwidth, XML parsing and an API round-trip.
@@ -100,7 +100,7 @@ export interface SiteKitLayoutProps {
100
100
  */
101
101
  design?: boolean | DesignConfig;
102
102
  /**
103
- * Defer client modules (Analytics, Engage, SitemapSync) until window load +
103
+ * Defer client modules (Analytics, chat, popups, SitemapSync) until window load +
104
104
  * idle or the first user interaction, keeping their JS and mount work out of
105
105
  * the critical hydration path. Default: true. Pass false to restore legacy
106
106
  * eager mounting. SignalBridge is never deferred.
@@ -2,7 +2,7 @@
2
2
  * SiteKitClientProviders — Client Island
3
3
  *
4
4
  * This is the 'use client' boundary for SiteKitLayout.
5
- * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)
5
+ * It composes the client-only providers (Analytics, chat, popups, Signal, SitemapSync)
6
6
  * that require React context or browser APIs.
7
7
  *
8
8
  * All modules are lazy-loaded via next/dynamic so their JS is only downloaded
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * All modules share a unified identity (visitor ID + session ID) read from
12
12
  * the storage-backed singleton (shared/identity), ensuring consistent
13
- * tracking across Analytics, Signal, and Engage.
13
+ * tracking across Analytics, Signal, chat and popups.
14
14
  *
15
15
  * 4.0 INVARIANT — CHILDREN ARE NEVER WRAPPED. Every module here renders as a
16
16
  * childless sibling AFTER {children}; nothing provides context around page
@@ -37,7 +37,7 @@ export interface SiteKitClientProvidersProps {
37
37
  signal?: boolean | SignalConfig;
38
38
  /**
39
39
  * Runtime SitemapSync from the visitor's browser. Default FALSE — sitemap
40
- * registration belongs to build time and to sonor-api's nightly reconciler,
40
+ * registration belongs to build time and to Sonor's nightly reconciler,
41
41
  * not to whoever happens to load the page. See SiteKitLayout for the full
42
42
  * reasoning; in short, its guards live in session/localStorage, so every new
43
43
  * visitor missed them and re-POSTed the whole sitemap.
@@ -56,7 +56,7 @@ export interface SiteKitClientProvidersProps {
56
56
  */
57
57
  design?: boolean | DesignConfig;
58
58
  /**
59
- * Defer Analytics / Engage / SitemapSync until window load + idle or first
59
+ * Defer Analytics / chat / popups / SitemapSync until window load + idle or first
60
60
  * interaction (default true). Pass false to restore legacy eager mounting
61
61
  * on hydration. SignalBridge is never deferred — it must apply experiment
62
62
  * variants as early as possible.
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- export { SiteKitClientProviders } from '../chunk-ILAW3XKD.js';
2
+ export { SiteKitClientProviders } from '../chunk-VO3JYRT5.js';
3
3
  import '../chunk-6G43IRWR.js';
4
- import '../chunk-DUQMSNF2.js';
5
- import '../chunk-H42PZKVC.js';
4
+ import '../chunk-HGFAEDG3.js';
5
+ import '../chunk-CF5QNFYU.js';
6
6
  import '../chunk-ZTZQPYP6.js';
7
- import '../chunk-Q3S26EQA.js';
7
+ import '../chunk-S54ECQGY.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
9
  import '../chunk-FESKKJAS.js';
10
10
  import '../chunk-A4CC4ZG3.js';
@@ -12,7 +12,7 @@ import '../chunk-24QZEO3Q.js';
12
12
  import '../chunk-GJWI74ZZ.js';
13
13
  import '../chunk-43OCZ3JA.js';
14
14
  import '../chunk-EKBEOXTH.js';
15
- import '../chunk-PXZ7LAOY.js';
16
- import '../chunk-OUNRFXDC.js';
17
- import '../chunk-6OL23QYD.js';
15
+ import '../chunk-D6ZC7XKZ.js';
16
+ import '../chunk-K4ZHAURD.js';
17
+ import '../chunk-F24FNCTK.js';
18
18
  import '../chunk-PKBMQBKP.js';
@@ -1,12 +1,12 @@
1
- import { SiteKitClientProviders } from '../chunk-ILAW3XKD.js';
1
+ import { SiteKitClientProviders } from '../chunk-VO3JYRT5.js';
2
2
  import '../chunk-6G43IRWR.js';
3
- import '../chunk-DUQMSNF2.js';
4
- import '../chunk-H42PZKVC.js';
3
+ import '../chunk-HGFAEDG3.js';
4
+ import '../chunk-CF5QNFYU.js';
5
5
  import '../chunk-ZTZQPYP6.js';
6
6
  import { ManagedFavicon } from '../chunk-GW7GSBO7.js';
7
- import '../chunk-Q3S26EQA.js';
7
+ import '../chunk-S54ECQGY.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
- import { resolveClientCredential } from '../chunk-R3VKF43H.js';
9
+ import { resolveClientCredential } from '../chunk-RPZ7OQGD.js';
10
10
  import '../chunk-VX5CMNMM.js';
11
11
  import { ManagedScripts } from '../chunk-MVLMXC44.js';
12
12
  import { resolveApiOrigin } from '../chunk-X6F6SO4S.js';
@@ -17,9 +17,9 @@ import '../chunk-24QZEO3Q.js';
17
17
  import '../chunk-GJWI74ZZ.js';
18
18
  import '../chunk-43OCZ3JA.js';
19
19
  import '../chunk-EKBEOXTH.js';
20
- import '../chunk-PXZ7LAOY.js';
21
- import '../chunk-OUNRFXDC.js';
22
- import '../chunk-6OL23QYD.js';
20
+ import '../chunk-D6ZC7XKZ.js';
21
+ import '../chunk-K4ZHAURD.js';
22
+ import '../chunk-F24FNCTK.js';
23
23
  import '../chunk-PKBMQBKP.js';
24
24
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
25
25
 
@@ -3,7 +3,7 @@
3
3
  * Kept in a shared file so both server (SiteKitLayout) and client
4
4
  * (SiteKitClientProviders) components can reference them.
5
5
  */
6
- import type { ChatLauncherPlacement } from '../engage/types';
6
+ import type { ChatLauncherPlacement } from '../chat/types';
7
7
  import type { SiteDesignConfig } from '../website/design';
8
8
  /**
9
9
  * The site's design, for popups (Website → Popups & Banners). site-kit
@@ -20,7 +20,7 @@ export interface AnalyticsConfig {
20
20
  excludePaths?: string[];
21
21
  /**
22
22
  * Sub-site identifier — the domain/brand this set of pages belongs to under
23
- * the Sonor project (e.g. `ohiopowerstudies.com`, `truepowersystems.com`).
23
+ * the Sonor project (e.g. `ohio.example.com`, `example.com`).
24
24
  * Every analytics event is tagged with this dimension so a single Sonor
25
25
  * project can host many sites and the dashboard can filter / roll up per
26
26
  * site. If omitted, SiteKitLayout falls back to the host of
@@ -33,7 +33,7 @@ export interface AnalyticsConfig {
33
33
  *
34
34
  * A framed page's visitor is on whoever framed it, not on this site, so by
35
35
  * default an embed reports nothing — see `analytics/send-gate.ts` for the
36
- * phantom traffic that prompted this (Upforge case studies embed live
36
+ * phantom traffic that prompted this (agency case studies embed live
37
37
  * client sites, and every view was writing page views into the client's own
38
38
  * project). Same-origin frames are never blocked: a site embedding itself
39
39
  * is a real visit to that site.
@@ -47,9 +47,10 @@ export interface AnalyticsConfig {
47
47
  allowLocalhost?: boolean;
48
48
  }
49
49
  /**
50
- * Launcher placement (`position`, `offsetBottom`, `zIndex`) comes from
51
- * ChatLauncherPlacement in engage/types, the one definition every Engage
52
- * config surface extends.
50
+ * The deprecated `engage` prop's config. Launcher placement (`position`,
51
+ * `offsetBottom`, `zIndex`) comes from ChatLauncherPlacement in chat/types,
52
+ * the one definition every chat config surface extends; `zIndex` also stacks
53
+ * popups.
53
54
  */
54
55
  export interface EngageConfig extends ChatLauncherPlacement {
55
56
  chatEnabled?: boolean;
@@ -17,8 +17,8 @@ import type { SpeakableSchemaProps, SpeakableConfig } from './types';
17
17
  * // In a page component
18
18
  * <SpeakableSchema
19
19
  * type="Article"
20
- * name="Family Law Services in Cincinnati"
21
- * url="https://heinrichlaw.com/family-law"
20
+ * name="Family Law Services in Springfield"
21
+ * url="https://example.com/family-law"
22
22
  * speakable={{
23
23
  * cssSelectors: ['.page-summary', '.key-points', 'h1']
24
24
  * }}
@@ -24,7 +24,7 @@ export declare function formatAgentAccessSection(baseUrl: string, options?: Agen
24
24
  /**
25
25
  * Add the section to finished markdown, once. Left out when the markdown
26
26
  * already points agents at a server card: a site describing its own MCP
27
- * server (upforge.io's "Agent interface" section) keeps its own words.
27
+ * server in a section of its own keeps its own words.
28
28
  */
29
29
  export declare function appendAgentAccessSection(markdown: string, baseUrl: string, options?: AgentAccessOptions): string;
30
30
  /** The markdown already tells agents where an MCP server is. */
@@ -33,7 +33,7 @@ export declare function describesMcp(markdown: string): boolean;
33
33
  * - `built-in`: site-kit's Sonor tools (`sonorMcpServer` / `sonorMcpTools`),
34
34
  * what `npx sonor-setup mcp` writes. site-kit's automatic MCP extras (the
35
35
  * llms.txt section) are on for these.
36
- * - `custom`: the site runs an MCP server of its own (upforge.io). site-kit
36
+ * - `custom`: the site runs an MCP server of its own. site-kit
37
37
  * leaves it alone: nothing automatic, `sonor-setup mcp` won't write over
38
38
  * it, and anything it adds is opt-in.
39
39
  * - `null`: no MCP server.
@@ -11,8 +11,8 @@
11
11
  * - createRobotsTxtHandler(): a plain-text robots.txt route handler.
12
12
  *
13
13
  * No `Content-Signal` line is ever emitted (6.3.4). Google's robots.txt
14
- * parser reports it as an "Unknown directive" error in Search Console
15
- * (cincinnaticondoconnection.com, 2026-09-22), and robots.txt is the one file
14
+ * parser reports it as an "Unknown directive" error in Search Console, and
15
+ * robots.txt is the one file
16
16
  * that must parse cleanly for every crawler. Training/retrieval preferences
17
17
  * are expressed by the per-crawler Allow/Disallow rules instead, which every
18
18
  * crawler understands.
@@ -28,8 +28,8 @@
28
28
  * Retrieval/search agents — fetch on demand or index for AI search, cite sources.
29
29
  *
30
30
  * MistralAI-User (Le Chat fetching a page for a user) and YouBot (You.com's
31
- * search index) were added 2026-09-15: vsf-consulting-nextjs named them in
32
- * its own robots.txt and had to keep a NOT_YET_IN_KIT list beside this one.
31
+ * search index) were added 2026-09-15, after a site had to name them in its
32
+ * own robots.txt beside this list.
33
33
  */
34
34
  export declare const AI_RETRIEVAL_CRAWLERS: readonly ['OAI-SearchBot', 'ChatGPT-User', 'Claude-SearchBot', 'Claude-User', 'PerplexityBot', 'Perplexity-User', 'GoogleOther', 'Applebot', 'DuckAssistBot', 'MistralAI-User', 'YouBot'];
35
35
  /**
@@ -35,7 +35,7 @@ export declare const getFAQItems: (projectId?: string, limit?: number, site?: st
35
35
  */
36
36
  export declare const getPageSummaries: (projectId?: string, limit?: number, site?: string) => Promise<LLMPageSummary[]>;
37
37
  /**
38
- * Fetch AI-optimized llms.txt markdown from Portal API (build-time)
38
+ * Fetch AI-optimized llms.txt markdown from Sonor API (build-time)
39
39
  * Used by writeLLMsTxtToPublic for static file generation
40
40
  *
41
41
  * Always fresh (shared/fresh-fetch.ts). With Next's patched fetch and no cache
@@ -44,7 +44,7 @@ export declare const getPageSummaries: (projectId?: string, limit?: number, site
44
44
  */
45
45
  export declare function getOptimizedLLMsTxt(options?: {
46
46
  full?: boolean;
47
- /** Matches Portal GET /api/public/llms/txt?publicSummaryOnly=true */
47
+ /** Matches Sonor GET /api/public/llms/txt?publicSummaryOnly=true */
48
48
  publicSummaryOnly?: boolean;
49
49
  /**
50
50
  * Sub-site host — scopes the page index to THIS domain on multi-site
@@ -1,2 +1,2 @@
1
- export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, isEmittableReviewNode, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../chunk-4Y5FWDPM.js';
1
+ export { LLMS_DISCLAIMER_MAX_LENGTH, LLMS_PUBLIC_SUMMARY_MAX_LENGTH, LLM_GEO_CONTRACT_VERSION, MANAGED_LLM_SCHEMA_KNOWN_KEYS, clipAtWordBoundary, isEmittableReviewNode, pickManagedLlmSchemaForJsonLd, sanitizeLlmsDisclaimerLine, sanitizeLlmsPublicSummary, sanitizePrimaryLanguageTag } from '../chunk-NZ4RXN3G.js';
2
2
  import '../chunk-PKBMQBKP.js';
@@ -10,7 +10,7 @@
10
10
  */
11
11
  import type { GenerateLLMSTxtOptions, LLMSTxtContent } from './types';
12
12
  /**
13
- * Generate llms.txt content from Portal data
13
+ * Generate llms.txt content from Sonor data
14
14
  *
15
15
  * @example
16
16
  * ```ts