@farm.js/core 0.1.24 → 0.1.26

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 (167) hide show
  1. package/dist/agent-runtime.d.mts +2 -2
  2. package/dist/agent-runtime.d.ts +2 -2
  3. package/dist/api/route-manager.cjs +4 -4
  4. package/dist/api/route-manager.d.mts +2 -2
  5. package/dist/api/route-manager.d.ts +2 -2
  6. package/dist/api/route-manager.mjs +3 -3
  7. package/dist/api/runtime.cjs +3 -3
  8. package/dist/api/runtime.mjs +2 -2
  9. package/dist/api.cjs +7 -7
  10. package/dist/api.d.mts +3 -3
  11. package/dist/api.d.ts +3 -3
  12. package/dist/api.mjs +6 -6
  13. package/dist/{app-BZDWwwFa.d.mts → app-29vG5tmY.d.mts} +3 -3
  14. package/dist/{app-BV-7wV5q.d.ts → app-Cx71s_PT.d.ts} +3 -3
  15. package/dist/app-markdown.cjs +6 -4
  16. package/dist/app-markdown.d.mts +3 -3
  17. package/dist/app-markdown.d.ts +3 -3
  18. package/dist/app-markdown.mjs +5 -3
  19. package/dist/{chunk-ISTFC3MZ.cjs → chunk-2CT6XUNO.cjs} +99 -26
  20. package/dist/{chunk-G6GNNB44.cjs → chunk-3TQG7CGC.cjs} +201 -180
  21. package/dist/{chunk-KNPRCKXK.cjs → chunk-3TQWUUNP.cjs} +9 -7
  22. package/dist/{chunk-LYM7HY34.cjs → chunk-3WSWXPYM.cjs} +4 -4
  23. package/dist/{chunk-GZ3ZPTQV.mjs → chunk-52SH7TKB.mjs} +2 -2
  24. package/dist/{chunk-JIKGGIOL.mjs → chunk-6D242YGO.mjs} +1 -1
  25. package/dist/{chunk-MVUREHPN.mjs → chunk-74RZNRY6.mjs} +1 -1
  26. package/dist/{chunk-BD7FZ63M.cjs → chunk-ALIFMS4A.cjs} +1 -1
  27. package/dist/{chunk-PGQBL5DN.mjs → chunk-ARXCHQLX.mjs} +79 -2
  28. package/dist/{chunk-2QLBIPFT.cjs → chunk-B6ZCT36X.cjs} +4 -4
  29. package/dist/{chunk-IMBMOEWT.cjs → chunk-BD2U4ZL6.cjs} +8 -8
  30. package/dist/{chunk-2M435BUE.mjs → chunk-CEYUWDWA.mjs} +7 -5
  31. package/dist/{chunk-XI3GWPUS.cjs → chunk-CRQPYWLK.cjs} +14 -14
  32. package/dist/{chunk-47H7VENP.mjs → chunk-DU2CASV6.mjs} +1 -1
  33. package/dist/{chunk-QTBEAKCJ.cjs → chunk-H7CJRJ4L.cjs} +16 -16
  34. package/dist/chunk-J63ZH5OQ.cjs +62 -0
  35. package/dist/{chunk-N255VYFP.mjs → chunk-JM5GQL4H.mjs} +8 -3
  36. package/dist/{chunk-6VEHUKZ2.mjs → chunk-MM5D6VLP.mjs} +4 -20
  37. package/dist/chunk-MVL2RAJW.mjs +62 -0
  38. package/dist/{chunk-YA6LLTIJ.cjs → chunk-ND224OE2.cjs} +4 -20
  39. package/dist/{chunk-YGMK6ESJ.mjs → chunk-OFKG57MZ.mjs} +2 -2
  40. package/dist/chunk-OOIL3BWR.mjs +1229 -0
  41. package/dist/{chunk-BNSD3VDY.mjs → chunk-PPIW3MH6.mjs} +1 -1
  42. package/dist/{chunk-WNUBR4CA.mjs → chunk-QGG336NI.mjs} +1 -1
  43. package/dist/chunk-QIH2HD6H.cjs +1229 -0
  44. package/dist/{chunk-OYDRPBBV.cjs → chunk-QJ4D3UKJ.cjs} +80 -3
  45. package/dist/{chunk-LQIRVSBY.cjs → chunk-QLXEYIAW.cjs} +13 -13
  46. package/dist/{chunk-ARHWIOUZ.mjs → chunk-QPPQHB6X.mjs} +111 -40
  47. package/dist/{chunk-7BC6GAL7.mjs → chunk-RAI7NULA.mjs} +76 -3
  48. package/dist/{chunk-AH7HOAQ3.cjs → chunk-RCYINC4A.cjs} +9 -4
  49. package/dist/{chunk-SIQMTHCZ.cjs → chunk-SZ4LYNUX.cjs} +212 -141
  50. package/dist/{chunk-5UX4C5QI.mjs → chunk-TKDY6AJP.mjs} +1 -1
  51. package/dist/{chunk-YJJLXIIS.cjs → chunk-U74A3P2P.cjs} +7 -7
  52. package/dist/{chunk-6YSEHN46.mjs → chunk-UXQXGB5A.mjs} +36 -15
  53. package/dist/{chunk-72VJRKJD.mjs → chunk-VZWO3XVL.mjs} +2 -2
  54. package/dist/{chunk-I5YBCWQ6.cjs → chunk-W2HZKYES.cjs} +2 -2
  55. package/dist/{chunk-DNLQMFER.cjs → chunk-WFPRVVF2.cjs} +26 -19
  56. package/dist/{chunk-BDJNP7AQ.mjs → chunk-YMUH2BLR.mjs} +10 -3
  57. package/dist/{client-plugins-B_XzCegf.d.mts → client-plugins-B8RPJnot.d.mts} +129 -4
  58. package/dist/{client-plugins-CKsXQfXY.d.ts → client-plugins-bPBf4haK.d.ts} +129 -4
  59. package/dist/client-plugins.d.mts +2 -2
  60. package/dist/client-plugins.d.ts +2 -2
  61. package/dist/client.cjs +4 -4
  62. package/dist/client.d.mts +6 -6
  63. package/dist/client.d.ts +6 -6
  64. package/dist/client.mjs +3 -3
  65. package/dist/config.d.mts +2 -2
  66. package/dist/config.d.ts +2 -2
  67. package/dist/{devtools-OY4SNU3P.mjs → devtools-5D4ZDRPR.mjs} +5 -3
  68. package/dist/{devtools-UHRSZ7VA.cjs → devtools-QZJEUOJW.cjs} +6 -4
  69. package/dist/docs.cjs +8 -6
  70. package/dist/docs.mjs +7 -5
  71. package/dist/index.cjs +29 -23
  72. package/dist/index.d.mts +14 -14
  73. package/dist/index.d.ts +14 -14
  74. package/dist/index.mjs +28 -22
  75. package/dist/integrations.d.mts +2 -2
  76. package/dist/integrations.d.ts +2 -2
  77. package/dist/internal/app-markdown-runtime.cjs +5 -3
  78. package/dist/internal/app-markdown-runtime.d.mts +2 -2
  79. package/dist/internal/app-markdown-runtime.d.ts +2 -2
  80. package/dist/internal/app-markdown-runtime.mjs +4 -2
  81. package/dist/internal/build-runtime.cjs +18 -17
  82. package/dist/internal/build-runtime.d.mts +4 -4
  83. package/dist/internal/build-runtime.d.ts +4 -4
  84. package/dist/internal/build-runtime.mjs +17 -16
  85. package/dist/internal/cli-runtime.cjs +6 -5
  86. package/dist/internal/cli-runtime.mjs +5 -4
  87. package/dist/internal/client-error-overlay.cjs +4 -4
  88. package/dist/internal/client-error-overlay.mjs +1 -1
  89. package/dist/internal/compression-runtime.d.mts +2 -2
  90. package/dist/internal/compression-runtime.d.ts +2 -2
  91. package/dist/internal/config-runtime.cjs +6 -4
  92. package/dist/internal/config-runtime.d.mts +3 -3
  93. package/dist/internal/config-runtime.d.ts +3 -3
  94. package/dist/internal/config-runtime.mjs +5 -3
  95. package/dist/internal/infra-analytics-runtime.cjs +4 -3
  96. package/dist/internal/infra-analytics-runtime.mjs +2 -1
  97. package/dist/internal/product-telemetry-runtime.cjs +2 -2
  98. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  99. package/dist/internal/production-runtime.cjs +12 -5
  100. package/dist/internal/production-runtime.d.mts +33 -9
  101. package/dist/internal/production-runtime.d.ts +33 -9
  102. package/dist/internal/production-runtime.mjs +11 -4
  103. package/dist/markdown.cjs +6 -2
  104. package/dist/markdown.d.mts +63 -1
  105. package/dist/markdown.d.ts +63 -1
  106. package/dist/markdown.mjs +5 -1
  107. package/dist/{metadata-B08w4EYV.d.mts → metadata-C3na4CBj.d.mts} +1 -1
  108. package/dist/{metadata-IQEblkZp.d.ts → metadata-CzBP4Mfp.d.ts} +1 -1
  109. package/dist/middleware.d.mts +4 -4
  110. package/dist/middleware.d.ts +4 -4
  111. package/dist/navigation.cjs +5 -5
  112. package/dist/navigation.d.mts +5 -5
  113. package/dist/navigation.d.ts +5 -5
  114. package/dist/navigation.mjs +4 -4
  115. package/dist/observability-BupkiN0m.d.mts +447 -0
  116. package/dist/observability-BupkiN0m.d.ts +447 -0
  117. package/dist/observability.d.mts +2 -417
  118. package/dist/observability.d.ts +2 -417
  119. package/dist/plugin.cjs +13 -12
  120. package/dist/plugin.d.mts +2 -2
  121. package/dist/plugin.d.ts +2 -2
  122. package/dist/plugin.mjs +12 -11
  123. package/dist/{production-runtime-DRSOkc-d.d.ts → production-runtime-CYg4wM4E.d.ts} +1 -1
  124. package/dist/{production-runtime-C3bGFEaM.d.mts → production-runtime-DP94hPGe.d.mts} +1 -1
  125. package/dist/query/client.cjs +6 -6
  126. package/dist/query/client.mjs +2 -2
  127. package/dist/{render-plan-CCFuMLNS.d.ts → render-plan-Bl6Fzg5z.d.ts} +1 -1
  128. package/dist/{render-plan-B6CKNl4e.d.mts → render-plan-CKAJg0jC.d.mts} +1 -1
  129. package/dist/renderer-client.cjs +5 -5
  130. package/dist/renderer-client.d.mts +4 -4
  131. package/dist/renderer-client.d.ts +4 -4
  132. package/dist/renderer-client.mjs +2 -2
  133. package/dist/{request-Dn6VURbE.d.ts → request-CR-Bp1Px.d.ts} +1 -1
  134. package/dist/{request-DgD1XsTx.d.mts → request-CrBCcPZZ.d.mts} +1 -1
  135. package/dist/request.d.mts +3 -3
  136. package/dist/request.d.ts +3 -3
  137. package/dist/{route-rendering-76A5I_kE.d.mts → route-rendering-C1NAHo-C.d.mts} +1 -1
  138. package/dist/{route-rendering-LAmQEdyG.d.ts → route-rendering-CZH5FegB.d.ts} +1 -1
  139. package/dist/{router-CnrRSa9d.d.mts → router-B57eDJ3u.d.mts} +1 -1
  140. package/dist/{router-BSOOGya2.d.ts → router-Cg_kD3Bd.d.ts} +1 -1
  141. package/dist/routes.d.mts +2 -2
  142. package/dist/routes.d.ts +2 -2
  143. package/dist/server-plugins.d.mts +3 -3
  144. package/dist/server-plugins.d.ts +3 -3
  145. package/dist/server.cjs +163 -106
  146. package/dist/server.d.mts +8 -8
  147. package/dist/server.d.ts +8 -8
  148. package/dist/server.mjs +144 -87
  149. package/dist/{spa-router-BMrSsG5b.d.ts → spa-router-BstQUO6Q.d.ts} +2 -2
  150. package/dist/{spa-router-DnYhWCvI.d.mts → spa-router-DTdbuinx.d.mts} +2 -2
  151. package/dist/testing.cjs +4 -4
  152. package/dist/testing.d.mts +2 -2
  153. package/dist/testing.d.ts +2 -2
  154. package/dist/testing.mjs +3 -3
  155. package/dist/{utils-ABkktwku.d.mts → utils-CS3ZLnEJ.d.mts} +1 -1
  156. package/dist/{utils-C3GguS-Q.d.ts → utils-D3rdsIvM.d.ts} +1 -1
  157. package/dist/version.cjs +2 -2
  158. package/dist/version.mjs +1 -1
  159. package/dist/vite.cjs +13 -12
  160. package/dist/vite.d.mts +2 -2
  161. package/dist/vite.d.ts +2 -2
  162. package/dist/vite.mjs +12 -11
  163. package/package.json +1 -1
  164. package/dist/chunk-BBVSJVBZ.cjs +0 -600
  165. package/dist/chunk-OFEY6KHO.mjs +0 -600
  166. package/dist/{chunk-XP777LRD.mjs → chunk-GDUYXFIS.mjs} +3 -3
  167. package/dist/{chunk-4PNUXIVU.cjs → chunk-YAOX43YI.cjs} +3 -3
@@ -19,16 +19,18 @@ async function resolveFarmNotFoundMetadata(layoutModules, notFoundModule) {
19
19
  }
20
20
  }
21
21
  let own = {};
22
+ let latestTitle;
22
23
  if (notFoundModule) {
23
24
  own = mergeMetadata(own, notFoundModule.metadata);
25
+ latestTitle = _optionalChain([notFoundModule, 'access', _ => _.metadata, 'optionalAccess', _2 => _2.title]);
24
26
  if (typeof notFoundModule.generateMetadata === "function") {
25
- own = mergeMetadata(
26
- own,
27
- await notFoundModule.generateMetadata({ params: {}, searchParams: {} })
28
- );
27
+ const generated = await notFoundModule.generateMetadata({ params: {}, searchParams: {} });
28
+ own = mergeMetadata(own, generated);
29
+ if (_optionalChain([generated, 'optionalAccess', _3 => _3.title]) !== void 0) latestTitle = generated.title;
29
30
  }
30
31
  }
31
- return mergeMetadata(metadata, { ...own, title: _nullishCoalesce(own.title, () => ( FARM_NOT_FOUND_TITLE)) });
32
+ const title = isRecord(latestTitle) && normalizeContent(latestTitle.absolute) ? latestTitle : own.title;
33
+ return mergeMetadata(metadata, { ...own, title: _nullishCoalesce(title, () => ( FARM_NOT_FOUND_TITLE)) });
32
34
  }
33
35
  _chunkS3JO3N4Hcjs.__name.call(void 0, resolveFarmNotFoundMetadata, "resolveFarmNotFoundMetadata");
34
36
  function mergeMetadata(base, next) {
@@ -135,8 +137,8 @@ function renderMetadataHead(metadata, options = {}) {
135
137
  appendMetaName(tags, "author", resolvedMetadata.author);
136
138
  if (Array.isArray(resolvedMetadata.authors)) {
137
139
  for (const author of resolvedMetadata.authors) {
138
- appendMetaName(tags, "author", _optionalChain([author, 'optionalAccess', _ => _.name]));
139
- if (_optionalChain([author, 'optionalAccess', _2 => _2.url])) {
140
+ appendMetaName(tags, "author", _optionalChain([author, 'optionalAccess', _4 => _4.name]));
141
+ if (_optionalChain([author, 'optionalAccess', _5 => _5.url])) {
140
142
  appendLink(tags, "author", resolveMetadataUrl(author.url, metadataBase));
141
143
  }
142
144
  }
@@ -15,7 +15,7 @@ var _chunkIK6LVLKCcjs = require('./chunk-IK6LVLKC.cjs');
15
15
  var _chunkHREOKQWTcjs = require('./chunk-HREOKQWT.cjs');
16
16
 
17
17
 
18
- var _chunkBBVSJVBZcjs = require('./chunk-BBVSJVBZ.cjs');
18
+ var _chunkQIH2HD6Hcjs = require('./chunk-QIH2HD6H.cjs');
19
19
 
20
20
 
21
21
  var _chunkEM6SBQKMcjs = require('./chunk-EM6SBQKM.cjs');
@@ -1181,11 +1181,11 @@ function shouldReturnMarkdown(request) {
1181
1181
  if (url.pathname.endsWith(".md")) return true;
1182
1182
  const accept = request.headers.get("accept");
1183
1183
  const markdown = Math.max(
1184
- _chunkBBVSJVBZcjs.farmAcceptQuality.call(void 0, accept, "text/markdown"),
1185
- _chunkBBVSJVBZcjs.farmAcceptQuality.call(void 0, accept, "text/plain")
1184
+ _chunkQIH2HD6Hcjs.farmAcceptQuality.call(void 0, accept, "text/markdown"),
1185
+ _chunkQIH2HD6Hcjs.farmAcceptQuality.call(void 0, accept, "text/plain")
1186
1186
  );
1187
1187
  if (markdown <= 0) return false;
1188
- return markdown >= _chunkBBVSJVBZcjs.farmAcceptQuality.call(void 0, accept, "text/html", { wildcards: true });
1188
+ return markdown >= _chunkQIH2HD6Hcjs.farmAcceptQuality.call(void 0, accept, "text/html", { wildcards: true });
1189
1189
  }
1190
1190
  _chunkS3JO3N4Hcjs.__name.call(void 0, shouldReturnMarkdown, "shouldReturnMarkdown");
1191
1191
  function escapeAttribute(value) {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useRouter
3
- } from "./chunk-5UX4C5QI.mjs";
3
+ } from "./chunk-TKDY6AJP.mjs";
4
4
  import {
5
5
  getRouter
6
- } from "./chunk-JIKGGIOL.mjs";
6
+ } from "./chunk-6D242YGO.mjs";
7
7
  import {
8
8
  applyFarmBasePath
9
9
  } from "./chunk-4RB44K6Z.mjs";
@@ -16,7 +16,7 @@ import {
16
16
  FARM_METADATA_ATTRIBUTE,
17
17
  renderMetadataHead,
18
18
  resolveMetadataTitle
19
- } from "./chunk-2M435BUE.mjs";
19
+ } from "./chunk-CEYUWDWA.mjs";
20
20
  import {
21
21
  createFarmDeploymentMismatchError,
22
22
  createFarmDeploymentRequestHeaders,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createFarmMarkdownRouteModule
3
- } from "./chunk-N255VYFP.mjs";
3
+ } from "./chunk-JM5GQL4H.mjs";
4
4
  import {
5
5
  __name
6
6
  } from "./chunk-LPEX4YW6.mjs";
@@ -1,5 +1,5 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});// package.json
2
- var version = "0.1.24";
2
+ var version = "0.1.26";
3
3
 
4
4
  // src/version.ts
5
5
  var FARM_VERSION = version;
@@ -3,16 +3,26 @@ import {
3
3
  } from "./chunk-XAXTTBUT.mjs";
4
4
  import {
5
5
  serializeFarmLlmsTxt
6
- } from "./chunk-7BC6GAL7.mjs";
6
+ } from "./chunk-RAI7NULA.mjs";
7
+ import {
8
+ emitFarmAgentRead
9
+ } from "./chunk-MVL2RAJW.mjs";
7
10
  import {
8
11
  resolveFarmThemeConfig
9
12
  } from "./chunk-AELACLOB.mjs";
13
+ import {
14
+ resolveFarmAPIServerBasePath,
15
+ resolveFarmAPIServerRoutePath
16
+ } from "./chunk-I6XDAKWQ.mjs";
10
17
  import {
11
18
  omitFarmResponseBody
12
19
  } from "./chunk-5WI2S4CO.mjs";
13
20
  import {
14
21
  localizeFarmPathname
15
22
  } from "./chunk-L3KT7IXV.mjs";
23
+ import {
24
+ applyFarmBasePath
25
+ } from "./chunk-4RB44K6Z.mjs";
16
26
  import {
17
27
  __name
18
28
  } from "./chunk-LPEX4YW6.mjs";
@@ -194,6 +204,9 @@ function createFarmMetadataRouteResponse(kind, value, routeModule = {}, options
194
204
  if (method !== "GET" && method !== "HEAD") {
195
205
  return new Response(null, { status: 405, headers: { Allow: "GET, HEAD" } });
196
206
  }
207
+ if ((kind === "llms" || kind === "llms-full") && options.request) {
208
+ emitFarmAgentRead(options.request, kind, isResponse(value) ? value.status : 200);
209
+ }
197
210
  if (isResponse(value)) {
198
211
  return method === "HEAD" ? omitFarmResponseBody(value) : value;
199
212
  }
@@ -440,6 +453,67 @@ function serializeInlineValue(value) {
440
453
  }
441
454
  __name(serializeInlineValue, "serializeInlineValue");
442
455
 
456
+ // src/api-catalog.ts
457
+ var FARM_API_CATALOG_PATH = "/.well-known/api-catalog";
458
+ var API_CATALOG_CONTENT_TYPE = 'application/linkset+json; profile="https://www.rfc-editor.org/info/rfc9727"';
459
+ function resolveFarmApiCatalogInput(config) {
460
+ const mcp = config.mcp && config.mcp.enabled !== false ? config.mcp : void 0;
461
+ return {
462
+ basePath: config.basePath,
463
+ apiBaseURL: config.openapi?.servers?.[0]?.url ?? config.api.baseURL,
464
+ openapi: config.openapi?.enabled ? { specRoute: config.openapi.specRoute, route: config.openapi.route } : void 0,
465
+ mcpPath: mcp ? resolveFarmAPIServerRoutePath(
466
+ mcp.path ?? "/api/mcp",
467
+ resolveFarmAPIServerBasePath(config.api)
468
+ ) : void 0
469
+ };
470
+ }
471
+ __name(resolveFarmApiCatalogInput, "resolveFarmApiCatalogInput");
472
+ function createFarmApiCatalog(input) {
473
+ const appPath = /* @__PURE__ */ __name((path) => applyFarmBasePath(path, input.basePath), "appPath");
474
+ const items = [];
475
+ const contexts = [];
476
+ const specRoute = input.openapi?.specRoute;
477
+ const reference = input.openapi?.route;
478
+ if (specRoute || reference) {
479
+ const api = { anchor: input.apiBaseURL };
480
+ if (specRoute) {
481
+ api["service-desc"] = [
482
+ { href: appPath(specRoute), type: "application/vnd.oai.openapi+json" }
483
+ ];
484
+ }
485
+ if (reference) api["service-doc"] = [{ href: appPath(reference), type: "text/html" }];
486
+ items.push({ href: input.apiBaseURL });
487
+ contexts.push(api);
488
+ }
489
+ if (input.mcpPath) items.push({ href: input.mcpPath });
490
+ return {
491
+ linkset: [{ anchor: appPath(FARM_API_CATALOG_PATH), item: items }, ...contexts]
492
+ };
493
+ }
494
+ __name(createFarmApiCatalog, "createFarmApiCatalog");
495
+ function createFarmApiCatalogResponse(method, input, request) {
496
+ const upperMethod = method.toUpperCase();
497
+ if (upperMethod !== "GET" && upperMethod !== "HEAD") {
498
+ return new Response("Method Not Allowed", {
499
+ status: 405,
500
+ headers: { Allow: "GET, HEAD", "Content-Type": "text/plain; charset=utf-8" }
501
+ });
502
+ }
503
+ if (request) emitFarmAgentRead(request, "api-catalog", 200);
504
+ const catalog = createFarmApiCatalog(input);
505
+ return new Response(upperMethod === "HEAD" ? null : JSON.stringify(catalog), {
506
+ status: 200,
507
+ headers: {
508
+ "Content-Type": API_CATALOG_CONTENT_TYPE,
509
+ "Cache-Control": "public, max-age=0, must-revalidate",
510
+ Link: `<${catalog.linkset[0].anchor}>; rel="api-catalog"`,
511
+ "X-Content-Type-Options": "nosniff"
512
+ }
513
+ });
514
+ }
515
+ __name(createFarmApiCatalogResponse, "createFarmApiCatalogResponse");
516
+
443
517
  export {
444
518
  renderFarmLocaleAlternateLinks,
445
519
  createLateRedirectRecovery,
@@ -449,5 +523,8 @@ export {
449
523
  getDefaultErrorStatusText,
450
524
  createDefaultErrorMarkup,
451
525
  createFarmThemeDocumentParts,
452
- applyFarmThemeDocument
526
+ applyFarmThemeDocument,
527
+ FARM_API_CATALOG_PATH,
528
+ resolveFarmApiCatalogInput,
529
+ createFarmApiCatalogResponse
453
530
  };
@@ -16,7 +16,7 @@ var _chunkJ7FSKED3cjs = require('./chunk-J7FSKED3.cjs');
16
16
 
17
17
 
18
18
 
19
- var _chunkKNPRCKXKcjs = require('./chunk-KNPRCKXK.cjs');
19
+ var _chunk3TQWUUNPcjs = require('./chunk-3TQWUUNP.cjs');
20
20
 
21
21
 
22
22
 
@@ -30,7 +30,7 @@ var _chunkQBK2AA4Ucjs = require('./chunk-QBK2AA4U.cjs');
30
30
  var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
31
31
 
32
32
  // src/client/metadata-reconciler.ts
33
- var MANAGED_ATTRIBUTE = _chunkKNPRCKXKcjs.FARM_METADATA_ATTRIBUTE;
33
+ var MANAGED_ATTRIBUTE = _chunk3TQWUUNPcjs.FARM_METADATA_ATTRIBUTE;
34
34
  var OWNED_SELECTORS = [
35
35
  'meta[name="description"]',
36
36
  'meta[name="keywords"]',
@@ -65,8 +65,8 @@ function removeAll(selector) {
65
65
  }
66
66
  _chunkS3JO3N4Hcjs.__name.call(void 0, removeAll, "removeAll");
67
67
  function applyFarmMetadataToDocument(metadata, pathname) {
68
- document.title = _chunkKNPRCKXKcjs.resolveMetadataTitle.call(void 0, _optionalChain([metadata, 'optionalAccess', _ => _.title])) || "Farm.js App";
69
- const rendered = _chunkKNPRCKXKcjs.renderMetadataHead.call(void 0, metadata, { pathname });
68
+ document.title = _chunk3TQWUUNPcjs.resolveMetadataTitle.call(void 0, _optionalChain([metadata, 'optionalAccess', _ => _.title])) || "Farm.js App";
69
+ const rendered = _chunk3TQWUUNPcjs.renderMetadataHead.call(void 0, metadata, { pathname });
70
70
  const template = document.createElement("template");
71
71
  template.innerHTML = rendered.tags;
72
72
  removeAll(OWNED_SELECTORS);
@@ -17,7 +17,7 @@ var _chunkLYLEZIG3cjs = require('./chunk-LYLEZIG3.cjs');
17
17
 
18
18
 
19
19
 
20
- var _chunk4PNUXIVUcjs = require('./chunk-4PNUXIVU.cjs');
20
+ var _chunkYAOX43YIcjs = require('./chunk-YAOX43YI.cjs');
21
21
 
22
22
 
23
23
  var _chunkWMAPPDMMcjs = require('./chunk-WMAPPDMM.cjs');
@@ -93,7 +93,7 @@ var _APIRouteManager = class _APIRouteManager {
93
93
  await this.loadProgrammaticApiRoutes(appDir);
94
94
  }
95
95
  this.routes = new Map(
96
- _chunk4PNUXIVUcjs.mergePluginAPIRoutes.call(void 0, [...this.routes.values()], this.plugins, void 0, {
96
+ _chunkYAOX43YIcjs.mergePluginAPIRoutes.call(void 0, [...this.routes.values()], this.plugins, void 0, {
97
97
  bodySizeLimit: this.bodySizeLimit
98
98
  }).map((route) => [route.path, route])
99
99
  );
@@ -140,7 +140,7 @@ var _APIRouteManager = class _APIRouteManager {
140
140
  const routeModule = await this.loadModule(filePath);
141
141
  const endpoints = {};
142
142
  const availableMethods = [];
143
- for (const method of _chunk4PNUXIVUcjs.API_ROUTE_METHODS) {
143
+ for (const method of _chunkYAOX43YIcjs.API_ROUTE_METHODS) {
144
144
  if (routeModule[method]) {
145
145
  endpoints[method] = routeModule[method];
146
146
  availableMethods.push(method);
@@ -322,7 +322,7 @@ var _APIRouteManager = class _APIRouteManager {
322
322
  const url = new URL(request.url);
323
323
  const pathname = url.pathname;
324
324
  const method = request.method.toUpperCase();
325
- const match = _chunk4PNUXIVUcjs.matchAPIRouteAtBasePath.call(void 0, this.routes, pathname, this.basePath);
325
+ const match = _chunkYAOX43YIcjs.matchAPIRouteAtBasePath.call(void 0, this.routes, pathname, this.basePath);
326
326
  if (!match) {
327
327
  return new Response(JSON.stringify({ error: "Not Found" }), {
328
328
  status: 404,
@@ -330,19 +330,19 @@ var _APIRouteManager = class _APIRouteManager {
330
330
  });
331
331
  }
332
332
  const { route, params } = match;
333
- const endpoint = _chunk4PNUXIVUcjs.resolveAPIRouteEndpoint.call(void 0, route, method);
333
+ const endpoint = _chunkYAOX43YIcjs.resolveAPIRouteEndpoint.call(void 0, route, method);
334
334
  if (!endpoint) {
335
335
  return new Response(JSON.stringify({ error: "Method Not Allowed" }), {
336
336
  status: 405,
337
337
  headers: {
338
- Allow: _chunk4PNUXIVUcjs.getAllowedAPIRouteMethods.call(void 0, route).join(", "),
338
+ Allow: _chunkYAOX43YIcjs.getAllowedAPIRouteMethods.call(void 0, route).join(", "),
339
339
  "Content-Type": "application/json"
340
340
  }
341
341
  });
342
342
  }
343
343
  const invoke = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, async () => {
344
344
  try {
345
- return await _chunk4PNUXIVUcjs.invokeAPIRouteEndpoint.call(void 0, endpoint, request, params, this.bodySizeLimit);
345
+ return await _chunkYAOX43YIcjs.invokeAPIRouteEndpoint.call(void 0, endpoint, request, params, this.bodySizeLimit);
346
346
  } catch (error) {
347
347
  if (options.throwOnError) throw error;
348
348
  console.error(`[API Error] ${pathname}:`, error);
@@ -364,7 +364,7 @@ var _APIRouteManager = class _APIRouteManager {
364
364
  return Boolean(this.matchRoute(pathname));
365
365
  }
366
366
  matchRoute(pathname) {
367
- return _chunk4PNUXIVUcjs.matchAPIRouteAtBasePath.call(void 0, this.routes, pathname, this.basePath);
367
+ return _chunkYAOX43YIcjs.matchAPIRouteAtBasePath.call(void 0, this.routes, pathname, this.basePath);
368
368
  }
369
369
  /**
370
370
  * Get all routes for client type generation
@@ -19,16 +19,18 @@ async function resolveFarmNotFoundMetadata(layoutModules, notFoundModule) {
19
19
  }
20
20
  }
21
21
  let own = {};
22
+ let latestTitle;
22
23
  if (notFoundModule) {
23
24
  own = mergeMetadata(own, notFoundModule.metadata);
25
+ latestTitle = notFoundModule.metadata?.title;
24
26
  if (typeof notFoundModule.generateMetadata === "function") {
25
- own = mergeMetadata(
26
- own,
27
- await notFoundModule.generateMetadata({ params: {}, searchParams: {} })
28
- );
27
+ const generated = await notFoundModule.generateMetadata({ params: {}, searchParams: {} });
28
+ own = mergeMetadata(own, generated);
29
+ if (generated?.title !== void 0) latestTitle = generated.title;
29
30
  }
30
31
  }
31
- return mergeMetadata(metadata, { ...own, title: own.title ?? FARM_NOT_FOUND_TITLE });
32
+ const title = isRecord(latestTitle) && normalizeContent(latestTitle.absolute) ? latestTitle : own.title;
33
+ return mergeMetadata(metadata, { ...own, title: title ?? FARM_NOT_FOUND_TITLE });
32
34
  }
33
35
  __name(resolveFarmNotFoundMetadata, "resolveFarmNotFoundMetadata");
34
36
  function mergeMetadata(base, next) {
@@ -7,7 +7,7 @@ var _chunkSU7MH53Pcjs = require('./chunk-SU7MH53P.cjs');
7
7
 
8
8
 
9
9
 
10
- var _chunk2QLBIPFTcjs = require('./chunk-2QLBIPFT.cjs');
10
+ var _chunkB6ZCT36Xcjs = require('./chunk-B6ZCT36X.cjs');
11
11
 
12
12
 
13
13
  var _chunk5OVTOKGHcjs = require('./chunk-5OVTOKGH.cjs');
@@ -52,7 +52,7 @@ _chunkS3JO3N4Hcjs.__name.call(void 0, shouldBlockUnload, "shouldBlockUnload");
52
52
  function navigateViaRouter(href, basePath, replace, options = {}) {
53
53
  if (typeof window === "undefined") return;
54
54
  const url = _chunkI57LW5VZcjs.applyFarmBasePath.call(void 0, href, basePath);
55
- const spaRouter = _chunk2QLBIPFTcjs.getInstalledFarmSPARouter.call(void 0, );
55
+ const spaRouter = _chunkB6ZCT36Xcjs.getInstalledFarmSPARouter.call(void 0, );
56
56
  if (spaRouter) {
57
57
  void spaRouter.navigate(url, {
58
58
  replace,
@@ -65,7 +65,7 @@ function navigateViaRouter(href, basePath, replace, options = {}) {
65
65
  } else {
66
66
  window.history.pushState(null, "", url);
67
67
  }
68
- _chunk2QLBIPFTcjs.notifyHistoryChange.call(void 0, "url-search");
68
+ _chunkB6ZCT36Xcjs.notifyHistoryChange.call(void 0, "url-search");
69
69
  }
70
70
  _chunkS3JO3N4Hcjs.__name.call(void 0, navigateViaRouter, "navigateViaRouter");
71
71
  function useRouter(options = {}) {
@@ -85,7 +85,7 @@ function useRouter(options = {}) {
85
85
  setState(readRouterState(basePath, routeMatcher));
86
86
  }, "handlePopState");
87
87
  handlePopState();
88
- const unsubscribe = _chunk2QLBIPFTcjs.subscribeHistoryChange.call(void 0, handlePopState);
88
+ const unsubscribe = _chunkB6ZCT36Xcjs.subscribeHistoryChange.call(void 0, handlePopState);
89
89
  return unsubscribe;
90
90
  }, [basePath, routeMatcher]);
91
91
  const push = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, (href, navigateOptions) => {
@@ -96,11 +96,11 @@ function useRouter(options = {}) {
96
96
  }, "replace");
97
97
  const pushState = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, (pageState, href) => {
98
98
  if (typeof window === "undefined") return;
99
- _chunk2QLBIPFTcjs.getRouter.call(void 0, ).pushState(pageState, resolveClientHref(href, basePath));
99
+ _chunkB6ZCT36Xcjs.getRouter.call(void 0, ).pushState(pageState, resolveClientHref(href, basePath));
100
100
  }, "pushState");
101
101
  const replaceState = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, (pageState, href) => {
102
102
  if (typeof window === "undefined") return;
103
- _chunk2QLBIPFTcjs.getRouter.call(void 0, ).replaceState(pageState, resolveClientHref(href, basePath));
103
+ _chunkB6ZCT36Xcjs.getRouter.call(void 0, ).replaceState(pageState, resolveClientHref(href, basePath));
104
104
  }, "replaceState");
105
105
  const back = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, () => {
106
106
  if (typeof window !== "undefined") {
@@ -124,25 +124,25 @@ function useRouter(options = {}) {
124
124
  }
125
125
  _chunkS3JO3N4Hcjs.__name.call(void 0, useRouter, "useRouter");
126
126
  function usePageState() {
127
- const [state, setState] = _react.useState.call(void 0, () => _chunk2QLBIPFTcjs.readPageState.call(void 0, ));
127
+ const [state, setState] = _react.useState.call(void 0, () => _chunkB6ZCT36Xcjs.readPageState.call(void 0, ));
128
128
  _react.useEffect.call(void 0, () => {
129
129
  if (typeof window === "undefined") return;
130
130
  const handlePopState = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, () => {
131
- setState(_chunk2QLBIPFTcjs.readPageState.call(void 0, ));
131
+ setState(_chunkB6ZCT36Xcjs.readPageState.call(void 0, ));
132
132
  }, "handlePopState");
133
133
  handlePopState();
134
- return _chunk2QLBIPFTcjs.subscribeHistoryChange.call(void 0, handlePopState);
134
+ return _chunkB6ZCT36Xcjs.subscribeHistoryChange.call(void 0, handlePopState);
135
135
  }, []);
136
136
  return state;
137
137
  }
138
138
  _chunkS3JO3N4Hcjs.__name.call(void 0, usePageState, "usePageState");
139
139
  function useNavigation() {
140
140
  const [state, setState] = _react.useState.call(void 0,
141
- () => _chunk2QLBIPFTcjs.getRouter.call(void 0, ).getNavigationState()
141
+ () => _chunkB6ZCT36Xcjs.getRouter.call(void 0, ).getNavigationState()
142
142
  );
143
143
  _react.useEffect.call(void 0, () => {
144
144
  if (typeof window === "undefined") return;
145
- return _chunk2QLBIPFTcjs.getRouter.call(void 0, ).subscribeNavigation(setState);
145
+ return _chunkB6ZCT36Xcjs.getRouter.call(void 0, ).subscribeNavigation(setState);
146
146
  }, []);
147
147
  return state;
148
148
  }
@@ -155,7 +155,7 @@ function useBlocker(options) {
155
155
  if (typeof window === "undefined" || !active) {
156
156
  return;
157
157
  }
158
- return _chunk2QLBIPFTcjs.getRouter.call(void 0, ).addBlocker(
158
+ return _chunkB6ZCT36Xcjs.getRouter.call(void 0, ).addBlocker(
159
159
  async (context) => {
160
160
  const current = optionsRef.current;
161
161
  const when = typeof current.when === "function" ? current.when(context) : current.when;
@@ -179,7 +179,7 @@ function useScrollRestoration(key) {
179
179
  _react.useEffect.call(void 0, () => {
180
180
  const element = ref.current;
181
181
  if (!element) return;
182
- return _chunk2QLBIPFTcjs.getRouter.call(void 0, ).registerScrollElement(key, element);
182
+ return _chunkB6ZCT36Xcjs.getRouter.call(void 0, ).registerScrollElement(key, element);
183
183
  }, [key]);
184
184
  return ref;
185
185
  }
@@ -201,7 +201,7 @@ function readRouterState(basePath, routeMatcher) {
201
201
  pathname,
202
202
  searchParams: url.searchParams,
203
203
  params: _optionalChain([routeMatcher, 'optionalAccess', _5 => _5.match, 'call', _6 => _6(routePathname), 'optionalAccess', _7 => _7.params]) || {},
204
- pageState: typeof window === "undefined" ? null : _chunk2QLBIPFTcjs.readPageState.call(void 0, )
204
+ pageState: typeof window === "undefined" ? null : _chunkB6ZCT36Xcjs.readPageState.call(void 0, )
205
205
  };
206
206
  }
207
207
  _chunkS3JO3N4Hcjs.__name.call(void 0, readRouterState, "readRouterState");
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-TVGP4BBZ.mjs";
16
16
  import {
17
17
  farmAcceptQuality
18
- } from "./chunk-OFEY6KHO.mjs";
18
+ } from "./chunk-OOIL3BWR.mjs";
19
19
  import {
20
20
  matchesFarmIfNoneMatch
21
21
  } from "./chunk-XF7Q24PF.mjs";
@@ -6,7 +6,7 @@ var _chunk4PPEPOZZcjs = require('./chunk-4PPEPOZZ.cjs');
6
6
  var _chunkMQ3H6LT5cjs = require('./chunk-MQ3H6LT5.cjs');
7
7
 
8
8
 
9
- var _chunkIMBMOEWTcjs = require('./chunk-IMBMOEWT.cjs');
9
+ var _chunkBD2U4ZL6cjs = require('./chunk-BD2U4ZL6.cjs');
10
10
 
11
11
 
12
12
  var _chunkN4RLRSWWcjs = require('./chunk-N4RLRSWW.cjs');
@@ -19,7 +19,7 @@ var _chunk2CQ74SP6cjs = require('./chunk-2CQ74SP6.cjs');
19
19
 
20
20
 
21
21
 
22
- var _chunk4PNUXIVUcjs = require('./chunk-4PNUXIVU.cjs');
22
+ var _chunkYAOX43YIcjs = require('./chunk-YAOX43YI.cjs');
23
23
 
24
24
 
25
25
  var _chunk6V4TDWECcjs = require('./chunk-6V4TDWEC.cjs');
@@ -105,7 +105,7 @@ function farmApiPlugin(options = {}) {
105
105
  const existing = apiRoutesCache.get(routePath);
106
106
  const existingFile = _optionalChain([endpointSources, 'access', _ => _.get, 'call', _2 => _2(routePath), 'optionalAccess', _3 => _3.get, 'call', _4 => _4(normalizedMethod)]);
107
107
  if (existingFile) {
108
- throw new (0, _chunkIMBMOEWTcjs.APIRouteConflictError)(routePath, normalizedMethod, existingFile, filePath);
108
+ throw new (0, _chunkBD2U4ZL6cjs.APIRouteConflictError)(routePath, normalizedMethod, existingFile, filePath);
109
109
  }
110
110
  if (existing) {
111
111
  if (!existing.methods.includes(normalizedMethod)) {
@@ -189,7 +189,7 @@ function farmApiPlugin(options = {}) {
189
189
  const url = new URL(request.url);
190
190
  const method = request.method.toUpperCase();
191
191
  const pathname = url.pathname;
192
- const match = _chunk4PNUXIVUcjs.matchAPIRouteAtBasePath.call(void 0, apiRoutesCache, pathname, basePath);
192
+ const match = _chunkYAOX43YIcjs.matchAPIRouteAtBasePath.call(void 0, apiRoutesCache, pathname, basePath);
193
193
  if (!match) {
194
194
  return new Response(JSON.stringify({ error: "Not Found" }), {
195
195
  status: 404,
@@ -197,18 +197,18 @@ function farmApiPlugin(options = {}) {
197
197
  });
198
198
  }
199
199
  const { route, params } = match;
200
- const endpoint = _chunk4PNUXIVUcjs.resolveAPIRouteEndpoint.call(void 0, route, method);
200
+ const endpoint = _chunkYAOX43YIcjs.resolveAPIRouteEndpoint.call(void 0, route, method);
201
201
  if (!endpoint) {
202
202
  return new Response(JSON.stringify({ error: "Method Not Allowed" }), {
203
203
  status: 405,
204
204
  headers: {
205
- Allow: _chunk4PNUXIVUcjs.getAllowedAPIRouteMethods.call(void 0, route).join(", "),
205
+ Allow: _chunkYAOX43YIcjs.getAllowedAPIRouteMethods.call(void 0, route).join(", "),
206
206
  "Content-Type": "application/json"
207
207
  }
208
208
  });
209
209
  }
210
210
  try {
211
- return await _chunk4PNUXIVUcjs.invokeAPIRouteEndpoint.call(void 0, endpoint, request, params, bodySizeLimit);
211
+ return await _chunkYAOX43YIcjs.invokeAPIRouteEndpoint.call(void 0, endpoint, request, params, bodySizeLimit);
212
212
  } catch (error) {
213
213
  return new Response(JSON.stringify({ error: error.message || "Internal Server Error" }), {
214
214
  status: 500,
@@ -255,7 +255,7 @@ function farmApiPlugin(options = {}) {
255
255
  const routeModule = await _chunkBMWDEBXOcjs.loadFarmDevModule.call(void 0, server, filePath);
256
256
  const endpoints = {};
257
257
  const availableMethods = [];
258
- for (const method of _chunk4PNUXIVUcjs.API_ROUTE_METHODS) {
258
+ for (const method of _chunkYAOX43YIcjs.API_ROUTE_METHODS) {
259
259
  if (routeModule[method]) {
260
260
  availableMethods.push(method);
261
261
  endpoints[method] = routeModule[method];
@@ -268,7 +268,7 @@ function farmApiPlugin(options = {}) {
268
268
  log(`API route discovered: ${availableMethods.join(", ")} ${routePath}`);
269
269
  }
270
270
  } catch (e) {
271
- if (e instanceof _chunkIMBMOEWTcjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
271
+ if (e instanceof _chunkBD2U4ZL6cjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
272
272
  log(`API route load failed at ${filePath}: ${e.message}`);
273
273
  }
274
274
  }
@@ -295,7 +295,7 @@ function farmApiPlugin(options = {}) {
295
295
  }
296
296
  }
297
297
  } catch (e) {
298
- if (e instanceof _chunkIMBMOEWTcjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
298
+ if (e instanceof _chunkBD2U4ZL6cjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
299
299
  log(`Root routes.ts load failed: ${e.message}`);
300
300
  }
301
301
  break;
@@ -326,7 +326,7 @@ function farmApiPlugin(options = {}) {
326
326
  }
327
327
  }
328
328
  } catch (e) {
329
- if (e instanceof _chunkIMBMOEWTcjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
329
+ if (e instanceof _chunkBD2U4ZL6cjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
330
330
  log(`Programmatic routes file load failed at ${routeFile}: ${e.message}`);
331
331
  }
332
332
  }
@@ -378,7 +378,7 @@ function farmApiPlugin(options = {}) {
378
378
  const pathname = url.split("?")[0];
379
379
  const method = req.method || "GET";
380
380
  if (discoveryPromise) await waitForDiscovery();
381
- if (!_chunk4PNUXIVUcjs.matchAPIRouteAtBasePath.call(void 0, apiRoutesCache, pathname, basePath)) {
381
+ if (!_chunkYAOX43YIcjs.matchAPIRouteAtBasePath.call(void 0, apiRoutesCache, pathname, basePath)) {
382
382
  return next();
383
383
  }
384
384
  if (!apiRouterHandler) {
@@ -399,7 +399,7 @@ function farmApiPlugin(options = {}) {
399
399
  }
400
400
  const currentUrl = req.url || url;
401
401
  const currentPathname = currentUrl.split("?")[0];
402
- if (currentPathname !== pathname && !_chunk4PNUXIVUcjs.matchAPIRouteAtBasePath.call(void 0, apiRoutesCache, currentPathname, basePath)) {
402
+ if (currentPathname !== pathname && !_chunkYAOX43YIcjs.matchAPIRouteAtBasePath.call(void 0, apiRoutesCache, currentPathname, basePath)) {
403
403
  return next();
404
404
  }
405
405
  const fullUrl = _chunk5ZSWG4UXcjs.resolveFarmRequestURL.call(void 0, req);
@@ -503,7 +503,7 @@ function farmApiPlugin(options = {}) {
503
503
  log(`API router recreated`);
504
504
  } catch (e) {
505
505
  restoreRouteState(previousState);
506
- if (e instanceof _chunkIMBMOEWTcjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
506
+ if (e instanceof _chunkBD2U4ZL6cjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
507
507
  log(`Root routes.ts HMR failed: ${e.message}`);
508
508
  }
509
509
  return [];
@@ -531,7 +531,7 @@ function farmApiPlugin(options = {}) {
531
531
  const routeModule = await _chunkBMWDEBXOcjs.loadFarmDevModule.call(void 0, server, file);
532
532
  removeEndpointsFromFile(file);
533
533
  const availableMethods = [];
534
- for (const method of _chunk4PNUXIVUcjs.API_ROUTE_METHODS) {
534
+ for (const method of _chunkYAOX43YIcjs.API_ROUTE_METHODS) {
535
535
  if (!routeModule[method]) continue;
536
536
  availableMethods.push(method);
537
537
  addEndpoint(routePath, file, method, routeModule[method]);
@@ -541,7 +541,7 @@ function farmApiPlugin(options = {}) {
541
541
  log(`API router recreated`);
542
542
  } catch (e) {
543
543
  restoreRouteState(previousState);
544
- if (e instanceof _chunkIMBMOEWTcjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
544
+ if (e instanceof _chunkBD2U4ZL6cjs.APIRouteConflictError || e instanceof _chunkNO3WWW3Ncjs.AmbiguousRouteError) throw e;
545
545
  log(`API route HMR failed: ${e.message}`);
546
546
  }
547
547
  return [];
@@ -0,0 +1,62 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
+
3
+ var _chunkE3UK5IIBcjs = require('./chunk-E3UK5IIB.cjs');
4
+
5
+
6
+ var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
7
+
8
+ // src/agent-identity.ts
9
+ var AGENT_TOKENS = [
10
+ ["ChatGPT-User", "openai", "agent"],
11
+ ["OAI-SearchBot", "openai", "crawler"],
12
+ ["GPTBot", "openai", "crawler"],
13
+ ["Claude-User", "anthropic", "agent"],
14
+ ["Claude-SearchBot", "anthropic", "crawler"],
15
+ ["ClaudeBot", "anthropic", "crawler"],
16
+ ["Perplexity-User", "perplexity", "agent"],
17
+ ["PerplexityBot", "perplexity", "crawler"],
18
+ ["CCBot", "other", "crawler"],
19
+ ["Bytespider", "other", "crawler"],
20
+ ["Meta-ExternalAgent", "other", "crawler"]
21
+ ];
22
+ var AGENT_PATTERNS = AGENT_TOKENS.map(([token, family, category]) => ({
23
+ pattern: new RegExp(`(?:^|[\\s;(])${token}(?=[/\\s;)]|$)`, "i"),
24
+ family,
25
+ category
26
+ }));
27
+ var UNKNOWN = { family: "unknown", category: "unknown", identity: "unknown" };
28
+ function classifyFarmAgent(userAgent) {
29
+ const value = (_nullishCoalesce(userAgent, () => ( ""))).slice(0, 2048);
30
+ const matches = AGENT_PATTERNS.filter(({ pattern }) => pattern.test(value));
31
+ if (matches.length === 1) {
32
+ const { family, category } = matches[0];
33
+ return { family, category, identity: "self-reported" };
34
+ }
35
+ return { ...UNKNOWN };
36
+ }
37
+ _chunkS3JO3N4Hcjs.__name.call(void 0, classifyFarmAgent, "classifyFarmAgent");
38
+ var FARM_INTERNAL_READ_HEADER = "x-farm-internal-read";
39
+ function emitFarmAgentRead(request, surface, status, view) {
40
+ if (request.headers.has(FARM_INTERNAL_READ_HEADER)) return;
41
+ let route;
42
+ try {
43
+ route = new URL(request.url).pathname;
44
+ } catch (e) {
45
+ return;
46
+ }
47
+ _chunkE3UK5IIBcjs.emitFarmEvent.call(void 0, {
48
+ type: "agent.read",
49
+ surface,
50
+ route,
51
+ ...view ? { view } : {},
52
+ status,
53
+ agent: classifyFarmAgent(request.headers.get("user-agent"))
54
+ });
55
+ }
56
+ _chunkS3JO3N4Hcjs.__name.call(void 0, emitFarmAgentRead, "emitFarmAgentRead");
57
+
58
+
59
+
60
+
61
+
62
+ exports.classifyFarmAgent = classifyFarmAgent; exports.FARM_INTERNAL_READ_HEADER = FARM_INTERNAL_READ_HEADER; exports.emitFarmAgentRead = emitFarmAgentRead;