@sonordev/site-kit 7.2.0 → 7.4.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 (108) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/agent-manifest.json +6 -4
  3. package/dist/{AnalyticsProvider-SLFFBRPE.js → AnalyticsProvider-BQXV3ZF3.js} +4 -4
  4. package/dist/{ArticleViewTracker-TM5AMGN2.js → ArticleViewTracker-3DH53RSB.js} +3 -3
  5. package/dist/{BlocksPopup-YJNJIVPO.js → BlocksPopup-FGWYVHCH.js} +4 -4
  6. package/dist/{ChatWidget-XKOSH66S.js → ChatWidget-CDQZCLVH.js} +5 -5
  7. package/dist/{FileField-CI4UL5SH.js → FileField-IPJ7L2W6.js} +3 -3
  8. package/dist/{FormSpotlight-F2AAEGBN.js → FormSpotlight-CQI2DBWI.js} +1 -1
  9. package/dist/{FormStage-BI5R5CNC.js → FormStage-4WHD6ED4.js} +1 -1
  10. package/dist/{ManagedForm-G6COGHXL.js → ManagedForm-7FZNH4L2.js} +6 -6
  11. package/dist/{ManagedNewsletterForm-BO3WCGXX.js → ManagedNewsletterForm-3D2BK3KQ.js} +4 -4
  12. package/dist/{SignalCore-ZA6WHKBR.js → SignalCore-HEQYITTM.js} +3 -3
  13. package/dist/{SiteChat-YJADDTKG.js → SiteChat-DMPDXY3W.js} +1 -1
  14. package/dist/{SiteDesignReporter-5YAW36AQ.js → SiteDesignReporter-Y2IOJE52.js} +5 -5
  15. package/dist/{SitePopups-ST5PMKZE.js → SitePopups-HD2LDKVU.js} +4 -4
  16. package/dist/SitemapSync-OKPZHRX6.js +8 -0
  17. package/dist/_client/booking-widget.js +5 -5
  18. package/dist/_client/testimonial-section.d.ts +1 -1
  19. package/dist/_client/testimonial-section.js +2 -1
  20. package/dist/affiliates/index.js +3 -3
  21. package/dist/analytics/index.js +4 -4
  22. package/dist/articles/index.js +1 -1
  23. package/dist/articles/server-ui.js +1 -1
  24. package/dist/chat/index.js +6 -6
  25. package/dist/{chunk-D6ZC7XKZ.js → chunk-3E3PPSNR.js} +2 -2
  26. package/dist/{chunk-6U3VLV2C.js → chunk-4BHRA7TI.js} +1 -1
  27. package/dist/{chunk-R46IQIGK.js → chunk-4DJMJ4V5.js} +2 -2
  28. package/dist/{chunk-BC4Y3S3D.js → chunk-5O62CER4.js} +7 -3
  29. package/dist/{chunk-EJVQJCG5.js → chunk-6LLTLLEJ.js} +2 -2
  30. package/dist/{chunk-BR4ZKUHH.js → chunk-7HPZSWS4.js} +17 -1
  31. package/dist/{chunk-S54ECQGY.js → chunk-AH4AXO4P.js} +1 -1
  32. package/dist/{chunk-D5DCBD4Y.js → chunk-ATE6IFVK.js} +1 -1
  33. package/dist/{chunk-GGORNBSC.js → chunk-AV4QAK5F.js} +1 -1
  34. package/dist/chunk-CAT235HY.js +13 -0
  35. package/dist/{chunk-JJ3DELUL.js → chunk-CG4ETW5Y.js} +2 -2
  36. package/dist/{chunk-JWTQS5F5.js → chunk-CKW4HFJG.js} +1 -1
  37. package/dist/{chunk-FR6BYFPC.js → chunk-CSN45MHO.js} +1 -1
  38. package/dist/{chunk-GEXT7BTE.js → chunk-D2RGEWHS.js} +1 -1
  39. package/dist/{chunk-JMLK6MH7.js → chunk-DA5XC7Y6.js} +1 -1
  40. package/dist/{chunk-CF5QNFYU.js → chunk-EHR4NIMX.js} +2 -2
  41. package/dist/{chunk-5V2V5C3Y.js → chunk-FUQTV5O6.js} +1 -1
  42. package/dist/{chunk-K4ZHAURD.js → chunk-GK7TV7EK.js} +1 -1
  43. package/dist/{chunk-RPZ7OQGD.js → chunk-IE5SSOCN.js} +3 -10
  44. package/dist/{chunk-HGFAEDG3.js → chunk-JRCNUUNG.js} +1 -1
  45. package/dist/{chunk-F24FNCTK.js → chunk-KHQ5GD6T.js} +1 -1
  46. package/dist/{chunk-IAM3D3RL.js → chunk-MDP7EB4J.js} +3 -3
  47. package/dist/{chunk-BKY2ZNM7.js → chunk-MHGAZ3LL.js} +1 -1
  48. package/dist/chunk-OD2ULW5Z.js +57 -0
  49. package/dist/{chunk-64DKGVEI.js → chunk-OOD6GMT4.js} +2 -2
  50. package/dist/{chunk-OWZ7ATLZ.js → chunk-PF64OEXC.js} +1 -1
  51. package/dist/{chunk-5YCEMV2L.js → chunk-PQDJNIHR.js} +1 -1
  52. package/dist/{chunk-VX5CMNMM.js → chunk-UAYAJPEP.js} +7 -1
  53. package/dist/{chunk-VHKEF5ZB.js → chunk-XA2BNW5M.js} +1 -1
  54. package/dist/{chunk-VO3JYRT5.js → chunk-XEMHGJEG.js} +8 -8
  55. package/dist/{chunk-NV72HZ4W.js → chunk-YCFW2OQO.js} +1 -1
  56. package/dist/{chunk-QL6XNPSD.js → chunk-ZTLU3BSW.js} +26 -9
  57. package/dist/client/index.js +3 -3
  58. package/dist/commerce/index.js +4 -4
  59. package/dist/engage/index.js +7 -7
  60. package/dist/fleet/index.js +4 -4
  61. package/dist/forms/index.js +7 -7
  62. package/dist/forms/server.js +2 -2
  63. package/dist/images/index.js +4 -4
  64. package/dist/index.js +1 -1
  65. package/dist/layout/client.js +7 -7
  66. package/dist/layout/index.js +9 -9
  67. package/dist/llms/agent-access.d.ts +4 -0
  68. package/dist/llms/index.js +6 -6
  69. package/dist/maps/index.js +3 -3
  70. package/dist/mcp/WebMcpTools.d.ts +5 -4
  71. package/dist/mcp/client.js +14 -7
  72. package/dist/mcp/discovery.d.ts +48 -0
  73. package/dist/mcp/handlers.d.ts +13 -7
  74. package/dist/mcp/index.d.ts +5 -3
  75. package/dist/mcp/index.js +61 -17
  76. package/dist/mcp/serverCard.d.ts +6 -7
  77. package/dist/mcp/sonor.js +8 -8
  78. package/dist/reputation/TestimonialSection.d.ts +1 -1
  79. package/dist/reputation/VisualReviewCard.d.ts +6 -0
  80. package/dist/reputation/index.d.ts +2 -1
  81. package/dist/reputation/index.js +3 -1
  82. package/dist/reputation/review-photo.d.ts +2 -0
  83. package/dist/reputation/server.d.ts +3 -2
  84. package/dist/reputation/server.js +2 -0
  85. package/dist/reputation/types.d.ts +22 -0
  86. package/dist/revalidate/index.js +2 -2
  87. package/dist/seo/client.js +4 -4
  88. package/dist/seo/index.js +4 -4
  89. package/dist/seo/llms.js +6 -6
  90. package/dist/seo/register-sitemap-cli.js +1 -1
  91. package/dist/seo/sitemap.js +4 -4
  92. package/dist/server/index.js +3 -3
  93. package/dist/server/mint-site-token.d.ts +1 -2
  94. package/dist/shared/fresh-fetch.d.ts +9 -3
  95. package/dist/shared/version.d.ts +1 -1
  96. package/dist/signal/index.js +2 -2
  97. package/dist/sitemap/index.js +4 -4
  98. package/dist/sync/index.js +5 -5
  99. package/dist/website/images.js +4 -4
  100. package/dist/website/index.js +5 -5
  101. package/dist/website/popups.js +4 -4
  102. package/dist/{writeLLMsTxt-OV24LQVL.js → writeLLMsTxt-OL4KQERZ.js} +3 -3
  103. package/package.json +1 -1
  104. package/src/forms/README.md +2 -2
  105. package/src/llms/README.md +69 -0
  106. package/src/mcp/README.md +50 -16
  107. package/src/reputation/README.md +25 -0
  108. package/dist/SitemapSync-RJTEBINX.js +0 -8
@@ -29,11 +29,12 @@ export interface WebMcpToolsProps {
29
29
  /** MCP endpoint on this origin (default `/api/mcp`). */
30
30
  endpoint?: string;
31
31
  /**
32
- * Wait for the page to go quiet before registering (default true).
32
+ * Wait for the page to go quiet before registering (default false).
33
33
  *
34
- * Registration is not user-visible and must never compete with hydration.
35
- * An agent arriving at the page polls or listens for `toolchange`, so a
36
- * couple of hundred milliseconds costs nothing; a blocked LCP costs a lot.
34
+ * Supported browsers discover tools as soon as this component mounts, so
35
+ * an agent need not wait for window load, idle, or a human interaction.
36
+ * Pass true to retain load + idle activation. Unsupported browsers never
37
+ * fetch a catalog or register tools, regardless of this setting.
37
38
  */
38
39
  defer?: boolean;
39
40
  /**
@@ -6,21 +6,28 @@ import { useEffect } from 'react';
6
6
  function getModelContext() {
7
7
  if (typeof window === "undefined") return null;
8
8
  const doc = document;
9
- if (doc.modelContext) return doc.modelContext;
10
9
  const nav = navigator;
11
- return nav.modelContext ?? null;
10
+ for (const context of [doc.modelContext, nav.modelContext]) {
11
+ if (typeof context?.registerTool === "function" || typeof context?.provideContext === "function") {
12
+ return context;
13
+ }
14
+ }
15
+ return null;
12
16
  }
13
17
  function isWebMcpAvailable() {
14
18
  return getModelContext() !== null;
15
19
  }
20
+ var EMPTY_TOOLS = [];
21
+ var EMPTY_LOCAL_TOOLS = [];
16
22
  function WebMcpTools({
17
- tools = [],
18
- localTools = [],
23
+ tools = EMPTY_TOOLS,
24
+ localTools = EMPTY_LOCAL_TOOLS,
19
25
  endpoint = "/api/mcp",
20
- defer = true,
26
+ defer = false,
21
27
  discover = true
22
28
  }) {
23
- const ready = useDeferredActivation(defer);
29
+ const deferredReady = useDeferredActivation(defer);
30
+ const ready = !defer || deferredReady;
24
31
  useEffect(() => {
25
32
  if (!ready) return;
26
33
  const modelContext = getModelContext();
@@ -113,7 +120,7 @@ function WebMcpTools({
113
120
  await modelContext.provideContext({ tools: definitions });
114
121
  }
115
122
  } catch (error) {
116
- if (process.env.NODE_ENV !== "production") {
123
+ if (!controller.signal.aborted && process.env.NODE_ENV !== "production") {
117
124
  console.warn("[site-kit/mcp] WebMCP registration failed:", error);
118
125
  }
119
126
  }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Experimental domain discovery from the MCP Server Cards discovery draft.
3
+ * The catalog points at the existing card; it never copies tools or identity
4
+ * metadata whose authoritative source is the server/card itself.
5
+ *
6
+ * @see https://github.com/modelcontextprotocol/ext-server-card/blob/main/docs/discovery.md
7
+ */
8
+ import type { McpServerInfo } from './types';
9
+ import { MCP_SERVER_CARD_MEDIA_TYPE } from './serverCard';
10
+ export declare const MCP_AI_CATALOG_PATH = "/.well-known/ai-catalog.json";
11
+ export declare const MCP_AI_CATALOG_MEDIA_TYPE = "application/ai-catalog+json";
12
+ export interface McpAiCatalog {
13
+ specVersion: '1.0';
14
+ entries: {
15
+ identifier: string;
16
+ type: typeof MCP_SERVER_CARD_MEDIA_TYPE;
17
+ url: string;
18
+ }[];
19
+ }
20
+ export interface BuildMcpAiCatalogOptions {
21
+ /** Reuse the server identity; `io.example/weather` becomes `mcp:weather`. */
22
+ info: Pick<McpServerInfo, 'name'>;
23
+ /** Explicit public site origin. Never inferred from an untrusted Host header. */
24
+ baseUrl: string;
25
+ /** Origin-relative card path, e.g. `/api/mcp/server-card`. */
26
+ serverCardPath: string;
27
+ }
28
+ /** Build the small, experimental catalog without duplicating the server card. */
29
+ export declare function buildMcpAiCatalog(options: BuildMcpAiCatalogOptions): McpAiCatalog;
30
+ export interface McpAiCatalogHandlerOptions extends BuildMcpAiCatalogOptions {
31
+ /** Seconds for `Cache-Control: public, max-age=…` (default 3600). */
32
+ maxAge?: number;
33
+ }
34
+ export interface McpDiscoveryRouteHandlers {
35
+ GET: (request?: Request) => Promise<Response>;
36
+ OPTIONS: () => Promise<Response>;
37
+ }
38
+ /**
39
+ * Serve the experimental catalog at `MCP_AI_CATALOG_PATH`. This static-safe
40
+ * handler leaves conditional ETag requests to the host/CDN, like llms.txt and
41
+ * the default card handler; it never reads incoming request headers.
42
+ */
43
+ export declare function createMcpAiCatalogHandler(options: McpAiCatalogHandlerOptions): McpDiscoveryRouteHandlers;
44
+ /** Shared public response policy for catalogs and cards; not an auth surface. */
45
+ export declare function createMcpDiscoveryHandlers(document: unknown, options: {
46
+ mediaType: string;
47
+ maxAge?: number;
48
+ }): McpDiscoveryRouteHandlers;
@@ -14,7 +14,8 @@
14
14
  */
15
15
  import { MCP_SUPPORTED_PROTOCOL_VERSIONS, type DispatchOutcome, type JsonRpcRequest, type McpServerDefinition } from './protocol';
16
16
  import type { McpToolCallRecord } from './types';
17
- import { type BuildMcpServerCardOptions } from './serverCard';
17
+ import { type BuildMcpServerCardOptions, MCP_SERVER_CARD_MEDIA_TYPE } from './serverCard';
18
+ import { type McpDiscoveryRouteHandlers } from './discovery';
18
19
  /**
19
20
  * Undo the spec's Base64 sentinel wrapper: `=?base64?{b64}?=`.
20
21
  * Values that aren't wrapped come back untouched.
@@ -74,18 +75,23 @@ export declare function createMcpHandler(options: McpHandlerOptions): McpRouteHa
74
75
  export interface McpServerCardHandlerOptions extends BuildMcpServerCardOptions {
75
76
  /** Seconds for `Cache-Control: public, max-age=…` (default 3600). */
76
77
  maxAge?: number;
78
+ /**
79
+ * Use the draft media type for a new canonical card URL. Existing routes
80
+ * default to application/json for compatibility. Both remain static-safe.
81
+ */
82
+ contentType?: 'application/json' | typeof MCP_SERVER_CARD_MEDIA_TYPE;
77
83
  }
78
- export interface McpServerCardRouteHandlers {
79
- GET: () => Promise<Response>;
80
- OPTIONS: () => Promise<Response>;
84
+ export interface McpServerCardRouteHandlers extends McpDiscoveryRouteHandlers {
81
85
  }
82
86
  /**
83
- * Serve the SEP-2127 server card. Mount at BOTH well-known paths.
87
+ * Serve the server card. Keep both existing well-known paths available; the
88
+ * experimental AI Catalog can also point to an alias under the MCP endpoint.
84
89
  *
85
- * The handler never reads the incoming Request, so the route stays statically
90
+ * The handler never reads Request, so the route stays statically
86
91
  * prerenderable — the same constraint the llms.txt handlers document, and for
87
92
  * the same reason: touching `request.headers` opts the route into dynamic
88
- * rendering and it stops being served from the CDN.
93
+ * rendering. ETag validation is left to the host/CDN. Canonical card routes
94
+ * can use `contentType: MCP_SERVER_CARD_MEDIA_TYPE`; legacy aliases keep JSON.
89
95
  *
90
96
  * @example
91
97
  * ```ts
@@ -8,8 +8,8 @@
8
8
  *
9
9
  * 1. Remote MCP endpoint — `createMcpHandler`. Streamable HTTP, dual-era
10
10
  * (2026-07-28 modern + the `initialize` handshake older clients speak).
11
- * 2. Discovery — `createMcpServerCardHandler`, the SEP-2127 card served at
12
- * `/.well-known/mcp-server-card` and `/.well-known/mcp.json`.
11
+ * 2. Discovery — `createMcpAiCatalogHandler` (experimental draft) points to
12
+ * `createMcpServerCardHandler`; existing well-known card URLs still work.
13
13
  * 3. In-page WebMCP — `<WebMcpTools>` (imperative) and
14
14
  * `declarativeToolForm` (declarative), for browser-driving agents.
15
15
  *
@@ -20,8 +20,10 @@ export type { JsonSchemaNode, JsonSchemaObject, McpContent, McpTextContent, McpR
20
20
  export { defineMcpTool } from './types';
21
21
  export { MCP_PROTOCOL_VERSION_MODERN, MCP_PROTOCOL_VERSIONS_LEGACY, MCP_SUPPORTED_PROTOCOL_VERSIONS, META_PROTOCOL_VERSION, META_CLIENT_INFO, META_SERVER_INFO, MCP_ERROR_HEADER_MISMATCH, MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION, JSONRPC_METHOD_NOT_FOUND, dispatch, toToolResult, toolErrorResult, toToolDescriptor, validateArgs, isSupportedVersion, } from './protocol';
22
22
  export type { JsonRpcRequest, JsonRpcResponse, JsonRpcError, DispatchOutcome, DispatchOptions, McpServerDefinition, McpToolDescriptor, } from './protocol';
23
- export { buildMcpServerCard, validateMcpServerCard, MCP_SERVER_CARD_SCHEMA, MCP_SERVER_CARD_PATH, MCP_SERVER_CARD_LEGACY_PATH, SITE_KIT_CARD_META_KEY, } from './serverCard';
23
+ export { buildMcpServerCard, validateMcpServerCard, MCP_SERVER_CARD_SCHEMA, MCP_SERVER_CARD_PATH, MCP_SERVER_CARD_LEGACY_PATH, MCP_SERVER_CARD_MEDIA_TYPE, SITE_KIT_CARD_META_KEY, } from './serverCard';
24
24
  export type { McpServerCard, McpRemote, BuildMcpServerCardOptions, } from './serverCard';
25
+ export { buildMcpAiCatalog, createMcpAiCatalogHandler, MCP_AI_CATALOG_PATH, MCP_AI_CATALOG_MEDIA_TYPE, } from './discovery';
26
+ export type { McpAiCatalog, BuildMcpAiCatalogOptions, McpAiCatalogHandlerOptions, McpDiscoveryRouteHandlers, } from './discovery';
25
27
  export { createMcpHandler, createMcpServerCardHandler, decodeHeaderValue, toolCallRecord, WEBMCP_SURFACE_HEADER, } from './handlers';
26
28
  export type { McpHandlerOptions, McpRouteHandlers, McpServerCardHandlerOptions, McpServerCardRouteHandlers, } from './handlers';
27
29
  export { declarativeToolForm, declarativeToolField } from './declarative';
package/dist/mcp/index.js CHANGED
@@ -2,6 +2,7 @@ import { MCP_SUPPORTED_PROTOCOL_VERSIONS, dispatch, errorOutcome, JSONRPC_INVALI
2
2
  export { JSONRPC_METHOD_NOT_FOUND, MCP_ERROR_HEADER_MISMATCH, MCP_ERROR_UNSUPPORTED_PROTOCOL_VERSION, MCP_PROTOCOL_VERSIONS_LEGACY, MCP_PROTOCOL_VERSION_MODERN, MCP_SUPPORTED_PROTOCOL_VERSIONS, META_CLIENT_INFO, META_PROTOCOL_VERSION, META_SERVER_INFO, dispatch, isSupportedVersion, toToolDescriptor, toToolResult, toolErrorResult, validateArgs } from '../chunk-FYAB6CXS.js';
3
3
  export { declarativeToolField, declarativeToolForm } from '../chunk-HW7B43E5.js';
4
4
  import '../chunk-PKBMQBKP.js';
5
+ import { createHash } from 'crypto';
5
6
 
6
7
  // src/mcp/types.ts
7
8
  function defineMcpTool(tool) {
@@ -10,6 +11,7 @@ function defineMcpTool(tool) {
10
11
 
11
12
  // src/mcp/serverCard.ts
12
13
  var MCP_SERVER_CARD_SCHEMA = "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json";
14
+ var MCP_SERVER_CARD_MEDIA_TYPE = "application/mcp-server-card+json";
13
15
  var MCP_SERVER_CARD_PATH = "/.well-known/mcp-server-card";
14
16
  var MCP_SERVER_CARD_LEGACY_PATH = "/.well-known/mcp.json";
15
17
  var SITE_KIT_CARD_META_KEY = "io.sonor.site-kit/tools";
@@ -70,6 +72,60 @@ function validateMcpServerCard(card) {
70
72
  }
71
73
  return problems;
72
74
  }
75
+ var MCP_AI_CATALOG_PATH = "/.well-known/ai-catalog.json";
76
+ var MCP_AI_CATALOG_MEDIA_TYPE = "application/ai-catalog+json";
77
+ function buildMcpAiCatalog(options) {
78
+ const base = new URL(options.baseUrl);
79
+ if (!["http:", "https:"].includes(base.protocol) || base.username || base.password || base.search || base.hash || base.pathname !== "/") {
80
+ throw new Error("baseUrl must be an explicit HTTP(S) origin without credentials, query or fragment");
81
+ }
82
+ const name = /^[^/\s]+\/([^/\s]+)$/.exec(options.info.name)?.[1];
83
+ if (!name) {
84
+ throw new Error('info.name must have a namespace and server name, e.g. "io.example/weather"');
85
+ }
86
+ const path = options.serverCardPath;
87
+ if (!path || path.startsWith("//") || path.includes("\\") || /^[a-z][a-z\d+.-]*:/i.test(path)) {
88
+ throw new Error("serverCardPath must be an origin-relative path");
89
+ }
90
+ const cardUrl = new URL(path.startsWith("/") ? path : `/${path}`, base);
91
+ if (cardUrl.hash) throw new Error("serverCardPath must not include a fragment");
92
+ return {
93
+ specVersion: "1.0",
94
+ entries: [{
95
+ identifier: `urn:air:${base.hostname}:mcp:${encodeURIComponent(name)}`,
96
+ type: MCP_SERVER_CARD_MEDIA_TYPE,
97
+ url: cardUrl.href
98
+ }]
99
+ };
100
+ }
101
+ function createMcpAiCatalogHandler(options) {
102
+ return createMcpDiscoveryHandlers(buildMcpAiCatalog(options), {
103
+ mediaType: MCP_AI_CATALOG_MEDIA_TYPE,
104
+ maxAge: options.maxAge
105
+ });
106
+ }
107
+ function createMcpDiscoveryHandlers(document, options) {
108
+ const body = `${JSON.stringify(document, null, 2)}
109
+ `;
110
+ const etag = `W/"${createHash("sha256").update(body).digest("base64url")}"`;
111
+ const maxAge = options.maxAge ?? 3600;
112
+ if (!Number.isSafeInteger(maxAge) || maxAge < 0) {
113
+ throw new Error("maxAge must be a non-negative integer");
114
+ }
115
+ const headers = {
116
+ "Content-Type": options.mediaType,
117
+ "Cache-Control": `public, max-age=${maxAge}`,
118
+ ETag: etag,
119
+ "Access-Control-Allow-Origin": "*",
120
+ "Access-Control-Allow-Methods": "GET, OPTIONS",
121
+ "Access-Control-Allow-Headers": "Accept, Content-Type, If-None-Match",
122
+ "Access-Control-Expose-Headers": "ETag"
123
+ };
124
+ return {
125
+ GET: async () => new Response(body, { status: 200, headers }),
126
+ OPTIONS: async () => new Response(null, { status: 204, headers })
127
+ };
128
+ }
73
129
 
74
130
  // src/mcp/handlers.ts
75
131
  var MCP_REQUEST_HEADERS = [
@@ -256,22 +312,10 @@ function createMcpHandler(options) {
256
312
  return { POST, GET: methodNotAllowed, DELETE: methodNotAllowed, OPTIONS };
257
313
  }
258
314
  function createMcpServerCardHandler(options) {
259
- const card = buildMcpServerCard(options);
260
- const body = `${JSON.stringify(card, null, 2)}
261
- `;
262
- const maxAge = options.maxAge ?? 3600;
263
- const headers = {
264
- "Content-Type": "application/json",
265
- "Cache-Control": `public, max-age=${maxAge}`,
266
- // The card is a discovery document — it is meant to be fetched by anyone.
267
- "Access-Control-Allow-Origin": "*",
268
- "Access-Control-Allow-Methods": "GET, OPTIONS",
269
- "Access-Control-Allow-Headers": "Content-Type"
270
- };
271
- return {
272
- GET: async () => new Response(body, { status: 200, headers }),
273
- OPTIONS: async () => new Response(null, { status: 204, headers })
274
- };
315
+ return createMcpDiscoveryHandlers(buildMcpServerCard(options), {
316
+ mediaType: options.contentType ?? "application/json",
317
+ maxAge: options.maxAge
318
+ });
275
319
  }
276
320
 
277
- export { MCP_SERVER_CARD_LEGACY_PATH, MCP_SERVER_CARD_PATH, MCP_SERVER_CARD_SCHEMA, SITE_KIT_CARD_META_KEY, WEBMCP_SURFACE_HEADER, buildMcpServerCard, createMcpHandler, createMcpServerCardHandler, decodeHeaderValue, defineMcpTool, toolCallRecord, validateMcpServerCard };
321
+ export { MCP_AI_CATALOG_MEDIA_TYPE, MCP_AI_CATALOG_PATH, MCP_SERVER_CARD_LEGACY_PATH, MCP_SERVER_CARD_MEDIA_TYPE, MCP_SERVER_CARD_PATH, MCP_SERVER_CARD_SCHEMA, SITE_KIT_CARD_META_KEY, WEBMCP_SURFACE_HEADER, buildMcpAiCatalog, buildMcpServerCard, createMcpAiCatalogHandler, createMcpHandler, createMcpServerCardHandler, decodeHeaderValue, defineMcpTool, toolCallRecord, validateMcpServerCard };
@@ -11,16 +11,15 @@
11
11
  * with enough identity attached that a human reviewing the connection knows
12
12
  * what they're approving.
13
13
  *
14
- * ── The two paths ─────────────────────────────────────────────────────────
15
- * SEP-1649 originally proposed `/.well-known/mcp.json`. The ratified SEP-2127
16
- * moved to `/.well-known/mcp-server-card`. Plenty of deployed crawlers and
17
- * validators still probe the old path, and serving one JSON document from two
18
- * URLs costs nothing, so `createMcpServerCardHandler` is mounted at both.
19
- * `mcp-server-card` is the canonical one; `mcp.json` is compatibility.
14
+ * The existing well-known paths stay available for compatibility. The newer
15
+ * experimental discovery draft uses a domain AI Catalog pointing to a card
16
+ * URL, with `<streamable-http-url>/server-card` as its recommended location.
17
+ * Hosts can mount the same card handler there without changing the old URLs.
20
18
  */
21
19
  import type { McpServerIcon, McpServerInfo, SiteKitMcpTool } from './types';
22
20
  export declare const MCP_SERVER_CARD_SCHEMA = "https://static.modelcontextprotocol.io/schemas/v1/server-card.schema.json";
23
- /** Canonical well-known path (SEP-2127). */
21
+ export declare const MCP_SERVER_CARD_MEDIA_TYPE = "application/mcp-server-card+json";
22
+ /** Existing site-kit well-known path; retained for backward compatibility. */
24
23
  export declare const MCP_SERVER_CARD_PATH = "/.well-known/mcp-server-card";
25
24
  /** Superseded SEP-1649 path, still widely probed. */
26
25
  export declare const MCP_SERVER_CARD_LEGACY_PATH = "/.well-known/mcp.json";
package/dist/mcp/sonor.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { toolErrorResult } from '../chunk-FYAB6CXS.js';
2
2
  import { fetchReviews, fetchReviewStats } from '../chunk-EDYHROQ7.js';
3
3
  import { getOfferings } from '../chunk-G3NHWMP5.js';
4
- import { fetchBookingTypes, fetchAvailability } from '../chunk-BKY2ZNM7.js';
5
- import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-6U3VLV2C.js';
6
- import { getFormConfig } from '../chunk-5V2V5C3Y.js';
7
- import '../chunk-OWZ7ATLZ.js';
4
+ import { fetchBookingTypes, fetchAvailability } from '../chunk-MHGAZ3LL.js';
5
+ import { getLLMsData, getServices, getFAQItems, getPageSummaries } from '../chunk-4BHRA7TI.js';
6
+ import { getFormConfig } from '../chunk-FUQTV5O6.js';
7
+ import '../chunk-PF64OEXC.js';
8
8
  import '../chunk-YC7ELZS3.js';
9
9
  import '../chunk-ZTLMPUO6.js';
10
10
  import '../chunk-DXO6SBMD.js';
@@ -13,7 +13,7 @@ import { getAllArticles, getArticle } from '../chunk-PKGN32AU.js';
13
13
  import '../chunk-Y3INC4QJ.js';
14
14
  import '../chunk-QXMIKDOL.js';
15
15
  import '../chunk-WMVK77ND.js';
16
- import { resolveFetch } from '../chunk-VX5CMNMM.js';
16
+ import { resolveFetch } from '../chunk-UAYAJPEP.js';
17
17
  import '../chunk-NZ4RXN3G.js';
18
18
  import '../chunk-VWWITFWM.js';
19
19
  import '../chunk-MJP63SSS.js';
@@ -25,9 +25,9 @@ import '../chunk-C2FZBUSS.js';
25
25
  import '../chunk-5SQK3D53.js';
26
26
  import '../chunk-HW7B43E5.js';
27
27
  import '../chunk-NJCTQH2P.js';
28
- import '../chunk-D6ZC7XKZ.js';
29
- import '../chunk-K4ZHAURD.js';
30
- import { SITE_KIT_VERSION } from '../chunk-F24FNCTK.js';
28
+ import '../chunk-3E3PPSNR.js';
29
+ import '../chunk-GK7TV7EK.js';
30
+ import { SITE_KIT_VERSION } from '../chunk-KHQ5GD6T.js';
31
31
  import '../chunk-PKBMQBKP.js';
32
32
  import 'server-only';
33
33
  import { after } from 'next/server.js';
@@ -8,4 +8,4 @@
8
8
  */
9
9
  import React from 'react';
10
10
  import type { TestimonialSectionProps } from './types';
11
- export declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): React.JSX.Element | null;
11
+ export declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, showPhoto, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): React.JSX.Element | null;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { VisualReviewCardProps, VisualReviewGalleryProps } from './types';
3
+ /** Static, server-renderable photo and review card. Review quotes are rendered verbatim. */
4
+ export declare function VisualReviewCard(props: VisualReviewCardProps): React.JSX.Element;
5
+ /** Responsive server-renderable gallery; reviews without photos keep their quote card. */
6
+ export declare function VisualReviewGallery({ reviews, title, subtitle, showRating, className }: VisualReviewGalleryProps): React.JSX.Element | null;
@@ -4,5 +4,6 @@
4
4
  * Display client reviews and testimonials on your website
5
5
  */
6
6
  export { TestimonialSection } from './TestimonialSection';
7
+ export { VisualReviewCard, VisualReviewGallery } from './VisualReviewCard';
7
8
  export { fetchReviews, fetchReviewStats } from './api';
8
- export type { Review, ReviewStats, TestimonialSectionProps } from './types';
9
+ export type { Review, ReviewPhoto, ReviewStats, TestimonialSectionProps, VisualReviewCardProps, VisualReviewGalleryProps } from './types';
@@ -1,4 +1,6 @@
1
- export { TestimonialSection } from '../chunk-BR4ZKUHH.js';
1
+ export { TestimonialSection } from '../chunk-7HPZSWS4.js';
2
+ export { VisualReviewCard, VisualReviewGallery } from '../chunk-OD2ULW5Z.js';
3
+ import '../chunk-CAT235HY.js';
2
4
  export { fetchReviewStats, fetchReviews } from '../chunk-EDYHROQ7.js';
3
5
  import '../chunk-MH2DSGC6.js';
4
6
  import '../chunk-PKBMQBKP.js';
@@ -0,0 +1,2 @@
1
+ /** Public review photos must be ordinary HTTPS images, never inline or script URLs. */
2
+ export declare function reviewPhotoUrl(value: unknown): string | undefined;
@@ -1,9 +1,10 @@
1
1
  /**
2
- * @sonordev/site-kit/reputation/server - Server-safe API functions
2
+ * @sonordev/site-kit/reputation/server - Server-safe review feed and visual cards
3
3
  *
4
4
  * Use this entry point from React Server Components or any server-side context.
5
5
  * Importing from `./reputation` (which includes TestimonialSection) pulls in a
6
6
  * client-tainted bundle that can't be called from RSC.
7
7
  */
8
8
  export { fetchReviews, fetchReviewStats } from './api';
9
- export type { Review, ReviewStats, TestimonialSectionProps } from './types';
9
+ export { VisualReviewCard, VisualReviewGallery } from './VisualReviewCard';
10
+ export type { Review, ReviewPhoto, ReviewStats, TestimonialSectionProps, VisualReviewCardProps, VisualReviewGalleryProps } from './types';
@@ -1,3 +1,5 @@
1
+ export { VisualReviewCard, VisualReviewGallery } from '../chunk-OD2ULW5Z.js';
2
+ import '../chunk-CAT235HY.js';
1
3
  export { fetchReviewStats, fetchReviews } from '../chunk-EDYHROQ7.js';
2
4
  import '../chunk-MH2DSGC6.js';
3
5
  import '../chunk-PKBMQBKP.js';
@@ -8,11 +8,31 @@ export interface Review {
8
8
  role?: string;
9
9
  rating: number;
10
10
  image?: string;
11
+ /** A business-supplied work/property photo. `image` remains the reviewer avatar. */
12
+ photo?: ReviewPhoto | null;
11
13
  date?: string;
12
14
  platform?: string;
13
15
  isFeatured?: boolean;
14
16
  serviceTags?: string[];
15
17
  }
18
+ export interface ReviewPhoto {
19
+ fileId: string;
20
+ url: string;
21
+ altText: string;
22
+ caption: string;
23
+ }
24
+ export interface VisualReviewCardProps {
25
+ review: Review;
26
+ showRating?: boolean;
27
+ className?: string;
28
+ }
29
+ export interface VisualReviewGalleryProps {
30
+ reviews: Review[];
31
+ title?: string;
32
+ subtitle?: string;
33
+ showRating?: boolean;
34
+ className?: string;
35
+ }
16
36
  export interface ReviewStats {
17
37
  total_reviews: number;
18
38
  average_rating: number;
@@ -30,6 +50,8 @@ export interface TestimonialSectionProps {
30
50
  autoplay?: boolean;
31
51
  autoplayInterval?: number;
32
52
  showRating?: boolean;
53
+ /** Show attached business photos above the quote. Defaults to true. */
54
+ showPhoto?: boolean;
33
55
  maxReviews?: number;
34
56
  featuredOnly?: boolean;
35
57
  service?: string;
@@ -1,7 +1,7 @@
1
- import { createSeoRevalidationHandler } from '../chunk-VHKEF5ZB.js';
1
+ import { createSeoRevalidationHandler } from '../chunk-XA2BNW5M.js';
2
2
  import '../chunk-XTRZGXB2.js';
3
3
  export { SITE_CACHE_TAGS, SITE_REVALIDATE_PATH, isSiteRevalidatePong } from '../chunk-RYVDGXC2.js';
4
- import '../chunk-F24FNCTK.js';
4
+ import '../chunk-KHQ5GD6T.js';
5
5
  import '../chunk-PKBMQBKP.js';
6
6
 
7
7
  // src/revalidate/index.ts
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- export { SitemapSync } from '../chunk-GEXT7BTE.js';
2
+ export { SitemapSync } from '../chunk-D2RGEWHS.js';
3
3
  import '../chunk-YVKRYQRG.js';
4
4
  import '../chunk-43OCZ3JA.js';
5
5
  import '../chunk-EKBEOXTH.js';
6
- import '../chunk-D6ZC7XKZ.js';
7
- import '../chunk-K4ZHAURD.js';
8
- import '../chunk-F24FNCTK.js';
6
+ import '../chunk-3E3PPSNR.js';
7
+ import '../chunk-GK7TV7EK.js';
8
+ import '../chunk-KHQ5GD6T.js';
9
9
  import '../chunk-PKBMQBKP.js';
package/dist/seo/index.js CHANGED
@@ -2,7 +2,7 @@ export { ManagedNoScripts, ManagedScripts } from '../chunk-MVLMXC44.js';
2
2
  import { pickManagedLlmSchemaForJsonLd } from '../chunk-NZ4RXN3G.js';
3
3
  import { safeJsonLd } from '../chunk-4KZ6W3ZH.js';
4
4
  import { withoutSchemaPlaceholders } from '../chunk-VWWITFWM.js';
5
- export { SitemapSync } from '../chunk-GEXT7BTE.js';
5
+ export { SitemapSync } from '../chunk-D2RGEWHS.js';
6
6
  import { getManagedMetadata } from '../chunk-4YTYGG2C.js';
7
7
  export { generateSitemap, getABVariant, getManagedMetadata, getManagedMetadataWithAB, getRedirect, getRobotsDirective, isIndexable } from '../chunk-4YTYGG2C.js';
8
8
  import { getContentBlock, getSchemaMarkups, getSEOPageData, getEntityEnhancedSchema, getFAQData, getInternalLinks, getEntities, pruneSchemaTypes } from '../chunk-662ILEZ6.js';
@@ -18,9 +18,9 @@ import '../chunk-FESKKJAS.js';
18
18
  import '../chunk-A4CC4ZG3.js';
19
19
  import '../chunk-43OCZ3JA.js';
20
20
  import '../chunk-EKBEOXTH.js';
21
- import '../chunk-D6ZC7XKZ.js';
22
- import '../chunk-K4ZHAURD.js';
23
- import '../chunk-F24FNCTK.js';
21
+ import '../chunk-3E3PPSNR.js';
22
+ import '../chunk-GK7TV7EK.js';
23
+ import '../chunk-KHQ5GD6T.js';
24
24
  import '../chunk-PKBMQBKP.js';
25
25
  import { Suspense } from 'react';
26
26
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
package/dist/seo/llms.js CHANGED
@@ -1,19 +1,19 @@
1
- export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-BC4Y3S3D.js';
1
+ export { createLLMsFullTxtHandler, createLLMsTxtHandler, formatSourcedFactsSection, llmsResponseHeaders } from '../chunk-5O62CER4.js';
2
2
  export { buildAiDiscoveryHeaders, wantsLlmsDiscoveryLink } from '../chunk-PO2TRJPY.js';
3
3
  export { AI_RETRIEVAL_CRAWLERS, AI_TRAINING_CRAWLERS, buildAiCrawlerRules, createRobotsTxtHandler } from '../chunk-QLTDFUJ7.js';
4
- export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-VHKEF5ZB.js';
4
+ export { LEGACY_PUBLICATION_PATH, SEO_REVALIDATION_MAX_BODY_BYTES, SEO_REVALIDATION_MAX_ITEMS, createLlmsRevalidateHandler, createSeoRevalidationHandler, parseSeoRevalidationPayload } from '../chunk-XA2BNW5M.js';
5
5
  import '../chunk-XTRZGXB2.js';
6
6
  export { AEOBlock, AEOCitedContent, AEOClaim, AEOComparison, AEODefinition, AEOEntity, AEOProvenanceList, AEOStep, AEOSteps, AEOSummary, DEFAULT_SPEAKABLE_SELECTORS, SpeakableSchema, createSpeakableSchema, getSpeakableSelectorsForPage } from '../chunk-PSAG45YF.js';
7
- export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-QL6XNPSD.js';
8
- export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-6U3VLV2C.js';
7
+ export { AGENT_ACCESS_HEADING, appendAgentAccessSection, describesMcp, detectMcpServer, formatAgentAccessSection, generateLLMsFullTxt, generateLLMsTxt, writeLLMsTxtToPublic } from '../chunk-ZTLU3BSW.js';
8
+ export { getBusinessInfo, getFAQItems, getLLMsData, getOptimizedLLMsTxt, getPageSummaries, getServices } from '../chunk-4BHRA7TI.js';
9
9
  import '../chunk-L5UOHS6E.js';
10
10
  import '../chunk-WMVK77ND.js';
11
- import '../chunk-VX5CMNMM.js';
11
+ import '../chunk-UAYAJPEP.js';
12
12
  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-NZ4RXN3G.js';
13
13
  import '../chunk-4KZ6W3ZH.js';
14
14
  import '../chunk-MJP63SSS.js';
15
15
  import '../chunk-YVKRYQRG.js';
16
16
  import '../chunk-FESKKJAS.js';
17
17
  import '../chunk-A4CC4ZG3.js';
18
- import '../chunk-F24FNCTK.js';
18
+ import '../chunk-KHQ5GD6T.js';
19
19
  import '../chunk-PKBMQBKP.js';
@@ -458,7 +458,7 @@ async function registerLocalSitemap(options) {
458
458
  }
459
459
  if (options.writeLlms && result.success) {
460
460
  try {
461
- const { writeLLMsTxtToPublic } = await import('../writeLLMsTxt-OV24LQVL.js');
461
+ const { writeLLMsTxtToPublic } = await import('../writeLLMsTxt-OL4KQERZ.js');
462
462
  const written = await writeLLMsTxtToPublic({
463
463
  // Resolved here too: the sync's own `site` is scoped to the branch that
464
464
  // posts, and this runs on the skip path as well.
@@ -1,10 +1,10 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-R46IQIGK.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-4DJMJ4V5.js';
2
2
  import '../chunk-Z22QVHT4.js';
3
- import '../chunk-QL6XNPSD.js';
4
- import '../chunk-6U3VLV2C.js';
3
+ import '../chunk-ZTLU3BSW.js';
4
+ import '../chunk-4BHRA7TI.js';
5
5
  import '../chunk-L5UOHS6E.js';
6
6
  import '../chunk-WMVK77ND.js';
7
- import '../chunk-VX5CMNMM.js';
7
+ import '../chunk-UAYAJPEP.js';
8
8
  import '../chunk-NZ4RXN3G.js';
9
9
  import '../chunk-MJP63SSS.js';
10
10
  import '../chunk-ZEGVKVD5.js';
@@ -1,6 +1,6 @@
1
- export { resolveClientCredential } from '../chunk-RPZ7OQGD.js';
2
- import '../chunk-VX5CMNMM.js';
1
+ export { resolveClientCredential } from '../chunk-IE5SSOCN.js';
2
+ import '../chunk-UAYAJPEP.js';
3
3
  export { requireServerApiConfig, resolveApiOrigin, resolveServerApiConfig, serverApiFetch } from '../chunk-X6F6SO4S.js';
4
4
  import '../chunk-MH2DSGC6.js';
5
- import '../chunk-F24FNCTK.js';
5
+ import '../chunk-KHQ5GD6T.js';
6
6
  import '../chunk-PKBMQBKP.js';
@@ -39,8 +39,7 @@
39
39
  * realistic redeploy gap; marketing sites routinely go many months untouched.
40
40
  */
41
41
  import 'server-only';
42
- import { resolveFetch } from '../shared/fresh-fetch';
43
- export { resolveFetch };
42
+ export { resolveFetch } from '../shared/fresh-fetch';
44
43
  /**
45
44
  * Next signals "this render must go dynamic" by THROWING (DynamicServerError,
46
45
  * static-gen bailout, redirect/notFound digests, React's postpone). Those are
@@ -2,9 +2,9 @@
2
2
  * @sonordev/site-kit shared - Fetch outside Next's Data Cache
3
3
  *
4
4
  * Single source of truth for requests that must not touch Next's Data Cache
5
- * and must not change how the calling route renders. Used by the build-time
6
- * writers (public/llms.txt, the sitemap's Sonor reads) and the site credential
7
- * mint (server/mint-site-token.ts). Don't re-fork this into a module.
5
+ * and must not change how the calling route renders. Used by build-time
6
+ * writers and the site credential mint. The mint uses trackedFreshFetch so
7
+ * Cache Components can await it without an uncached prerender bailout.
8
8
  *
9
9
  * Next.js monkey-patches `globalThis.fetch` so every call joins its Data Cache
10
10
  * and static-generation tracking. That's wrong for these requests, and the
@@ -38,6 +38,12 @@ export declare function resolveFetch(): {
38
38
  unpatched: boolean;
39
39
  };
40
40
  export declare const FRESH_FETCH_NONCE_HEADER = "x-sitekit-build-nonce";
41
+ /**
42
+ * A fresh request that Next can await during a Cache Components prerender.
43
+ * A unique cache key per request prevents reuse after a credential expires or
44
+ * across deploys. The caller owns memoization and concurrent-request deduping.
45
+ */
46
+ export declare function trackedFreshFetch(input: string | URL, init?: RequestInit): Promise<Response>;
41
47
  /**
42
48
  * Fetch that never reads a response cached by an earlier build.
43
49
  *
@@ -7,4 +7,4 @@
7
7
  * it matches package.json at publish time, and version.test.ts asserts it in
8
8
  * dev, so it can't silently drift.
9
9
  */
10
- export declare const SITE_KIT_VERSION = "7.2.0";
10
+ export declare const SITE_KIT_VERSION = "7.4.0";
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- import { useSignalExperiment, useSignalEvent } from '../chunk-S54ECQGY.js';
3
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-S54ECQGY.js';
2
+ import { useSignalExperiment, useSignalEvent } from '../chunk-AH4AXO4P.js';
3
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from '../chunk-AH4AXO4P.js';
4
4
  import '../chunk-PKBMQBKP.js';
5
5
  import React, { useEffect } from 'react';
6
6
  import { jsx, Fragment } from 'react/jsx-runtime';
@@ -1,10 +1,10 @@
1
- export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-R46IQIGK.js';
1
+ export { createSitemap, getPortfolioPaths, syncSitemapToPortal } from '../chunk-4DJMJ4V5.js';
2
2
  import '../chunk-Z22QVHT4.js';
3
- import '../chunk-QL6XNPSD.js';
4
- import '../chunk-6U3VLV2C.js';
3
+ import '../chunk-ZTLU3BSW.js';
4
+ import '../chunk-4BHRA7TI.js';
5
5
  import '../chunk-L5UOHS6E.js';
6
6
  import '../chunk-WMVK77ND.js';
7
- import '../chunk-VX5CMNMM.js';
7
+ import '../chunk-UAYAJPEP.js';
8
8
  import '../chunk-NZ4RXN3G.js';
9
9
  import '../chunk-MJP63SSS.js';
10
10
  import '../chunk-ZEGVKVD5.js';