@farm.js/core 0.1.41 → 0.1.42

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 (125) hide show
  1. package/dist/{agent-mcp-D0eZKfci.d.ts → agent-mcp-SSD6L3VZ.d.ts} +1 -1
  2. package/dist/{agent-mcp-BOqIxJLI.d.mts → agent-mcp-ssVy_tea.d.mts} +1 -1
  3. package/dist/agent-runtime.d.mts +1 -1
  4. package/dist/agent-runtime.d.ts +1 -1
  5. package/dist/api/route-manager.d.mts +3 -3
  6. package/dist/api/route-manager.d.ts +3 -3
  7. package/dist/api/runtime.d.mts +2 -2
  8. package/dist/api/runtime.d.ts +2 -2
  9. package/dist/api.d.mts +3 -3
  10. package/dist/api.d.ts +3 -3
  11. package/dist/{app-CzTSMJaf.d.mts → app-1h3lVT4a.d.mts} +4 -4
  12. package/dist/{app-DM8e1z3G.d.ts → app-KjFzdCqy.d.ts} +4 -4
  13. package/dist/app-manifest-D3RkVNuS.d.mts +120 -0
  14. package/dist/app-manifest-DaW8-tvX.d.ts +120 -0
  15. package/dist/app-markdown.d.mts +2 -2
  16. package/dist/app-markdown.d.ts +2 -2
  17. package/dist/{chunk-PYHPXPSW.mjs → chunk-2JZHQDUY.mjs} +1 -1
  18. package/dist/{chunk-R65GCA6A.mjs → chunk-375K2ZVU.mjs} +7 -7
  19. package/dist/{chunk-L6HYACBE.cjs → chunk-7YHSD3Z6.cjs} +77 -113
  20. package/dist/{chunk-EH3464KF.cjs → chunk-AHFRQMRX.cjs} +1 -1
  21. package/dist/{chunk-EX4MKHXN.cjs → chunk-BXJ5HJTJ.cjs} +7 -6
  22. package/dist/{chunk-BYQVROIP.mjs → chunk-DMRPN25V.mjs} +69 -0
  23. package/dist/{chunk-4C7KTKX7.mjs → chunk-IVQY6UTY.mjs} +1 -1
  24. package/dist/{chunk-3TB5QGUW.cjs → chunk-JAXDRRRC.cjs} +70 -1
  25. package/dist/{chunk-32TZ3QTP.cjs → chunk-JG3MEQUH.cjs} +85 -85
  26. package/dist/{chunk-ENOBPDKZ.mjs → chunk-NU25TRIO.mjs} +3 -2
  27. package/dist/{chunk-SVPGWJZF.mjs → chunk-PIZXONIS.mjs} +71 -107
  28. package/dist/{chunk-JOTUZIM4.cjs → chunk-QKZMB7LY.cjs} +2 -2
  29. package/dist/{chunk-FJGIVDA5.mjs → chunk-QTEJGB5A.mjs} +3 -3
  30. package/dist/{chunk-OQ4YXWH4.cjs → chunk-TCJ4A4A2.cjs} +57 -62
  31. package/dist/{chunk-BGGWKZ2V.mjs → chunk-TUL355PH.mjs} +6 -11
  32. package/dist/{chunk-VLPII2JJ.mjs → chunk-U2UC7UGP.mjs} +1 -1
  33. package/dist/{chunk-ROQ4C4LJ.cjs → chunk-ZATTDMBW.cjs} +48 -48
  34. package/dist/{chunk-PN676AZF.cjs → chunk-ZS6HDNOM.cjs} +6 -6
  35. package/dist/{client-plugins-CkYwvDJ0.d.mts → client-plugins-C9Py_50W.d.mts} +78 -6
  36. package/dist/{client-plugins-DfeKd0sD.d.ts → client-plugins-DIem0I0W.d.ts} +78 -6
  37. package/dist/client-plugins.d.mts +1 -1
  38. package/dist/client-plugins.d.ts +1 -1
  39. package/dist/client.d.mts +5 -5
  40. package/dist/client.d.ts +5 -5
  41. package/dist/config.d.mts +1 -1
  42. package/dist/config.d.ts +1 -1
  43. package/dist/{devtools-2YHAJYH6.cjs → devtools-2RY3EKHL.cjs} +3 -3
  44. package/dist/{devtools-N3QLRIQU.mjs → devtools-Q3LBNUJ7.mjs} +2 -2
  45. package/dist/docs.cjs +4 -4
  46. package/dist/docs.d.mts +2 -2
  47. package/dist/docs.d.ts +2 -2
  48. package/dist/docs.mjs +3 -3
  49. package/dist/index.cjs +9 -9
  50. package/dist/index.d.mts +14 -13
  51. package/dist/index.d.ts +14 -13
  52. package/dist/index.mjs +8 -8
  53. package/dist/integrations.d.mts +1 -1
  54. package/dist/integrations.d.ts +1 -1
  55. package/dist/internal/app-markdown-runtime.d.mts +2 -2
  56. package/dist/internal/app-markdown-runtime.d.ts +2 -2
  57. package/dist/internal/build-runtime.cjs +9 -9
  58. package/dist/internal/build-runtime.d.mts +3 -3
  59. package/dist/internal/build-runtime.d.ts +3 -3
  60. package/dist/internal/build-runtime.mjs +8 -8
  61. package/dist/internal/cli-runtime.cjs +3 -3
  62. package/dist/internal/cli-runtime.mjs +2 -2
  63. package/dist/internal/client-error-overlay.cjs +4 -4
  64. package/dist/internal/client-error-overlay.mjs +1 -1
  65. package/dist/internal/compression-runtime.d.mts +1 -1
  66. package/dist/internal/compression-runtime.d.ts +1 -1
  67. package/dist/internal/config-runtime.cjs +3 -3
  68. package/dist/internal/config-runtime.d.mts +2 -2
  69. package/dist/internal/config-runtime.d.ts +2 -2
  70. package/dist/internal/config-runtime.mjs +2 -2
  71. package/dist/internal/product-telemetry-runtime.cjs +2 -2
  72. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  73. package/dist/internal/production-runtime.cjs +5 -5
  74. package/dist/internal/production-runtime.d.mts +10 -127
  75. package/dist/internal/production-runtime.d.ts +10 -127
  76. package/dist/internal/production-runtime.mjs +4 -4
  77. package/dist/markdown.d.mts +1 -1
  78. package/dist/markdown.d.ts +1 -1
  79. package/dist/middleware.d.mts +3 -3
  80. package/dist/middleware.d.ts +3 -3
  81. package/dist/navigation.d.mts +4 -4
  82. package/dist/navigation.d.ts +4 -4
  83. package/dist/plugin.cjs +6 -6
  84. package/dist/plugin.d.mts +3 -3
  85. package/dist/plugin.d.ts +3 -3
  86. package/dist/plugin.mjs +5 -5
  87. package/dist/{production-runtime-BTkXQdYy.d.mts → production-runtime-CHFKIgpW.d.mts} +1 -1
  88. package/dist/{production-runtime-DFC7pgbp.d.ts → production-runtime-bjjWq-DA.d.ts} +1 -1
  89. package/dist/{render-plan-BoAK9xFC.d.ts → render-plan-B2UndB4x.d.ts} +1 -1
  90. package/dist/{render-plan-5rFeWmk7.d.mts → render-plan-DOHg6wdO.d.mts} +1 -1
  91. package/dist/renderer-client.d.mts +3 -3
  92. package/dist/renderer-client.d.ts +3 -3
  93. package/dist/{request-BxBWigtl.d.mts → request-DQcGfdgQ.d.mts} +1 -1
  94. package/dist/{request-fciwmd3n.d.ts → request-DVNXRQrI.d.ts} +1 -1
  95. package/dist/request.d.mts +2 -2
  96. package/dist/request.d.ts +2 -2
  97. package/dist/{route-rendering-BLZT0IP0.d.ts → route-rendering-B_6fj-GG.d.ts} +1 -1
  98. package/dist/{route-rendering-BCM1QzEf.d.mts → route-rendering-CEX4mFn-.d.mts} +1 -1
  99. package/dist/{router-CkheNX3-.d.ts → router-CHEMHm1P.d.ts} +1 -1
  100. package/dist/{router-DyZJWc1_.d.mts → router-CKHPBKXX.d.mts} +1 -1
  101. package/dist/routes.d.mts +1 -1
  102. package/dist/routes.d.ts +1 -1
  103. package/dist/{runtime-DfU4sKa5.d.ts → runtime-Br2ZDTAv.d.ts} +1 -1
  104. package/dist/{runtime-wexvUN5J.d.mts → runtime-jj8TKNsy.d.mts} +1 -1
  105. package/dist/server-plugins.d.mts +2 -2
  106. package/dist/server-plugins.d.ts +2 -2
  107. package/dist/server.cjs +22 -22
  108. package/dist/server.d.mts +9 -9
  109. package/dist/server.d.ts +9 -9
  110. package/dist/server.mjs +6 -6
  111. package/dist/{spa-router-DgsMXqfX.d.mts → spa-router-BEvS9Erj.d.mts} +2 -2
  112. package/dist/{spa-router-CcejECnG.d.ts → spa-router-DmCuH5B7.d.ts} +2 -2
  113. package/dist/{ssg-Bg4bMMhM.d.mts → ssg-57v6cZcW.d.mts} +2 -2
  114. package/dist/{ssg-1FGaFISl.d.ts → ssg-gT093ETk.d.ts} +2 -2
  115. package/dist/testing.d.mts +1 -1
  116. package/dist/testing.d.ts +1 -1
  117. package/dist/{utils-Dxbh6Hgj.d.ts → utils-CCTKvR-P.d.ts} +1 -1
  118. package/dist/{utils-8wtTYiH4.d.mts → utils-raHHQVyL.d.mts} +1 -1
  119. package/dist/version.cjs +2 -2
  120. package/dist/version.mjs +1 -1
  121. package/dist/vite.cjs +6 -6
  122. package/dist/vite.d.mts +4 -4
  123. package/dist/vite.d.ts +4 -4
  124. package/dist/vite.mjs +5 -5
  125. package/package.json +1 -1
@@ -6,6 +6,9 @@ var _chunkBMOBTMDRcjs = require('./chunk-BMOBTMDR.cjs');
6
6
  var _chunkOWOUTKIJcjs = require('./chunk-OWOUTKIJ.cjs');
7
7
 
8
8
 
9
+ var _chunkJAXDRRRCcjs = require('./chunk-JAXDRRRC.cjs');
10
+
11
+
9
12
  var _chunkD5IHNDHIcjs = require('./chunk-D5IHNDHI.cjs');
10
13
 
11
14
 
@@ -42,7 +45,7 @@ var _chunkKNBBQHO2cjs = require('./chunk-KNBBQHO2.cjs');
42
45
  var _chunk5NAVKJCZcjs = require('./chunk-5NAVKJCZ.cjs');
43
46
 
44
47
 
45
- var _chunkEH3464KFcjs = require('./chunk-EH3464KF.cjs');
48
+ var _chunkAHFRQMRXcjs = require('./chunk-AHFRQMRX.cjs');
46
49
 
47
50
 
48
51
  var _chunkBIDYX3SLcjs = require('./chunk-BIDYX3SL.cjs');
@@ -961,30 +964,28 @@ function isFarmAppManifestPath(pathname) {
961
964
  return pathname === FARM_APP_MANIFEST_PATH || pathname === FARM_APP_MANIFEST_LEGACY_PATH;
962
965
  }
963
966
  _chunkS3JO3N4Hcjs.__name.call(void 0, isFarmAppManifestPath, "isFarmAppManifestPath");
964
- var FARM_INFRA_SIGNATURE_HEADER = "farmjs-infra-signature";
965
- var SIGNED_PURPOSE = "farmjs-manifest-v1";
966
- var SIGNATURE_WINDOW_SECONDS = 300;
967
967
  function resolveFarmAppManifestInput(config, extra) {
968
968
  const llms = _optionalChain([config, 'access', _27 => _27.agent, 'optionalAccess', _28 => _28.llmsTxt]);
969
969
  const plugins = (_nullishCoalesce(config.plugins, () => ( []))).map(({ name }) => name);
970
970
  const webmcp = plugins.includes("farm:webmcp");
971
+ const sections = _chunkJAXDRRRCcjs.resolveFarmAppManifestConfig.call(void 0, _optionalChain([config, 'access', _29 => _29.agent, 'optionalAccess', _30 => _30.manifest]));
971
972
  return {
972
- renderer: _nullishCoalesce(_optionalChain([config, 'access', _29 => _29.renderer, 'optionalAccess', _30 => _30.name]), () => ( "react")),
973
+ renderer: _nullishCoalesce(_optionalChain([config, 'access', _31 => _31.renderer, 'optionalAccess', _32 => _32.name]), () => ( "react")),
973
974
  basePath: config.basePath || "/",
974
975
  build: extra.build,
975
976
  packages: extra.packages,
976
977
  webmcp: { enabled: webmcp, tools: webmcp ? _nullishCoalesce(extra.webmcpTools, () => ( [])) : [] },
977
978
  integrations: Object.entries(_nullishCoalesce(config.integrations, () => ( {}))).flatMap(([key, integration]) => {
978
- const category = _nullishCoalesce(_optionalChain([integration, 'optionalAccess', _31 => _31.category]), () => ( _optionalChain([integration, 'optionalAccess', _32 => _32.slot])));
979
+ const category = _nullishCoalesce(_optionalChain([integration, 'optionalAccess', _33 => _33.category]), () => ( _optionalChain([integration, 'optionalAccess', _34 => _34.slot])));
979
980
  return integration && category && integration.type ? [{ key, category, type: integration.type }] : [];
980
981
  }),
981
982
  agent: {
982
- apiCatalog: _optionalChain([config, 'access', _33 => _33.agent, 'optionalAccess', _34 => _34.apiCatalog]) ? "/.well-known/api-catalog" : null,
983
+ apiCatalog: _optionalChain([config, 'access', _35 => _35.agent, 'optionalAccess', _36 => _36.apiCatalog]) ? "/.well-known/api-catalog" : null,
983
984
  llmsTxt: llms === true || typeof llms === "object" && llms !== null && llms.enabled !== false,
984
- openapi: _optionalChain([config, 'access', _35 => _35.openapi, 'optionalAccess', _36 => _36.enabled]) && config.openapi.specRoute ? config.openapi.specRoute : null
985
+ openapi: _optionalChain([config, 'access', _37 => _37.openapi, 'optionalAccess', _38 => _38.enabled]) && config.openapi.specRoute ? config.openapi.specRoute : null
985
986
  },
986
987
  plugins,
987
- analytics: config.analytics !== false
988
+ ...sections ? { sections } : {}
988
989
  };
989
990
  }
990
991
  _chunkS3JO3N4Hcjs.__name.call(void 0, resolveFarmAppManifestInput, "resolveFarmAppManifestInput");
@@ -993,58 +994,73 @@ var SOURCES = {
993
994
  standalone: "defineTool",
994
995
  serverFunction: "serverFunction"
995
996
  };
996
- function createFarmAppManifest(input, { full = false } = {}) {
997
- const manifest = {
997
+ var DEFAULT_SECTIONS = _chunkJAXDRRRCcjs.resolveFarmAppManifestConfig.call(void 0, void 0);
998
+ function createFarmAppManifest(input) {
999
+ const sections = _nullishCoalesce(input.sections, () => ( DEFAULT_SECTIONS));
1000
+ const { app, mcp, webmcp } = sections;
1001
+ return {
998
1002
  schemaVersion: 1,
999
- app: {
1000
- farm: _chunkEH3464KFcjs.FARM_VERSION,
1001
- renderer: input.renderer,
1003
+ app: app ? {
1004
+ ...app.version ? { farm: _chunkAHFRQMRXcjs.FARM_VERSION } : {},
1005
+ ...app.renderer ? { renderer: input.renderer } : {},
1002
1006
  basePath: input.basePath,
1003
- build: input.build
1004
- },
1005
- packages: input.packages,
1006
- mcp: {
1007
- servers: _chunk75RZHGLScjs._listFarmMCPCatalogs.call(void 0, ).map(({ server, tools, details }) => {
1008
- const open = _optionalChain([details, 'optionalAccess', _37 => _37.public]) === true && !_optionalChain([input, 'access', _38 => _38.guardCoversPath, 'optionalCall', _39 => _39(server.path)]);
1009
- const listed = full || open;
1010
- return {
1011
- name: server.name,
1012
- version: server.version,
1013
- path: server.path,
1014
- authorization: open ? "none" : "required",
1015
- resources: listed ? [..._nullishCoalesce(_optionalChain([details, 'optionalAccess', _40 => _40.resources]), () => ( []))] : [],
1016
- prompts: listed ? [..._nullishCoalesce(_optionalChain([details, 'optionalAccess', _41 => _41.prompts]), () => ( []))] : [],
1017
- tools: (listed ? tools : []).map((tool) => {
1018
- const schemas = _optionalChain([details, 'optionalAccess', _42 => _42.schemas, 'optionalAccess', _43 => _43[tool.name]]);
1019
- const hints = Object.fromEntries(
1020
- ["readOnlyHint", "destructiveHint", "idempotentHint", "openWorldHint"].filter((hint) => typeof tool[hint] === "boolean").map((hint) => [hint, tool[hint]])
1021
- );
1022
- return {
1023
- name: tool.name,
1024
- ...tool.title ? { title: tool.title } : {},
1025
- ...tool.description ? { description: tool.description } : {},
1026
- source: SOURCES[tool.kind],
1027
- // MCP clients never see the route behind a tool; only Infra's view names it.
1028
- ...full && tool.kind === "endpoint" ? { method: tool.method, path: tool.path } : {},
1029
- ...hints,
1030
- ...schemas ? { inputSchema: schemas.input } : {},
1031
- ..._optionalChain([schemas, 'optionalAccess', _44 => _44.output]) ? { outputSchema: schemas.output } : {}
1032
- };
1033
- })
1034
- };
1035
- })
1036
- },
1037
- webmcp: input.webmcp,
1038
- integrations: input.integrations,
1039
- agent: input.agent,
1040
- plugins: input.plugins
1007
+ ...app.build ? { build: input.build } : {}
1008
+ } : null,
1009
+ packages: sections.packages === "names" ? Object.fromEntries(Object.keys(input.packages).map((name) => [name, null])) : sections.packages ? input.packages : null,
1010
+ mcp: mcp ? { servers: listServers(input, mcp) } : null,
1011
+ webmcp: webmcp ? {
1012
+ enabled: input.webmcp.enabled,
1013
+ tools: input.webmcp.tools.filter((tool) => !webmcp.hide.includes(tool.name))
1014
+ } : null,
1015
+ integrations: sections.integrations ? input.integrations : null,
1016
+ agent: sections.agent ? input.agent : null,
1017
+ plugins: sections.plugins ? input.plugins : null
1041
1018
  };
1042
- manifest.mcp.servers.push(...listDefaultServer(input));
1043
- return manifest;
1044
1019
  }
1045
1020
  _chunkS3JO3N4Hcjs.__name.call(void 0, createFarmAppManifest, "createFarmAppManifest");
1021
+ function listServers(input, mcp) {
1022
+ const servers = _chunk75RZHGLScjs._listFarmMCPCatalogs.call(void 0, ).map(({ server, tools, details }) => {
1023
+ const open = _optionalChain([details, 'optionalAccess', _39 => _39.public]) === true && !_optionalChain([input, 'access', _40 => _40.guardCoversPath, 'optionalCall', _41 => _41(server.path)]);
1024
+ return {
1025
+ name: server.name,
1026
+ version: server.version,
1027
+ path: server.path,
1028
+ authorization: open ? "none" : "required",
1029
+ resources: open ? [..._nullishCoalesce(_optionalChain([details, 'optionalAccess', _42 => _42.resources]), () => ( []))] : [],
1030
+ prompts: open ? [..._nullishCoalesce(_optionalChain([details, 'optionalAccess', _43 => _43.prompts]), () => ( []))] : [],
1031
+ tools: (open ? tools : []).map((tool) => {
1032
+ const schemas = _optionalChain([details, 'optionalAccess', _44 => _44.schemas, 'optionalAccess', _45 => _45[tool.name]]);
1033
+ const hints = Object.fromEntries(
1034
+ ["readOnlyHint", "destructiveHint", "idempotentHint", "openWorldHint"].filter((hint) => typeof tool[hint] === "boolean").map((hint) => [hint, tool[hint]])
1035
+ );
1036
+ return {
1037
+ name: tool.name,
1038
+ ...tool.title ? { title: tool.title } : {},
1039
+ ...tool.description ? { description: tool.description } : {},
1040
+ source: SOURCES[tool.kind],
1041
+ ...hints,
1042
+ ...schemas ? { inputSchema: schemas.input } : {},
1043
+ ..._optionalChain([schemas, 'optionalAccess', _46 => _46.output]) ? { outputSchema: schemas.output } : {}
1044
+ };
1045
+ })
1046
+ };
1047
+ });
1048
+ return [...servers, ...listDefaultServer(input)].filter((server) => !mcp.hide.includes(server.name)).map((server) => ({
1049
+ ...server,
1050
+ tools: server.tools.filter((tool) => !mcp.hide.includes(`${server.name}/${tool.name}`)).map((tool) => mcp.schemas ? tool : withoutSchemas(tool))
1051
+ }));
1052
+ }
1053
+ _chunkS3JO3N4Hcjs.__name.call(void 0, listServers, "listServers");
1054
+ function withoutSchemas({
1055
+ inputSchema: _input,
1056
+ outputSchema: _output,
1057
+ ...tool
1058
+ }) {
1059
+ return tool;
1060
+ }
1061
+ _chunkS3JO3N4Hcjs.__name.call(void 0, withoutSchemas, "withoutSchemas");
1046
1062
  function listDefaultServer(input) {
1047
- const server = _optionalChain([input, 'access', _45 => _45.defaultMCP, 'optionalCall', _46 => _46()]);
1063
+ const server = _optionalChain([input, 'access', _47 => _47.defaultMCP, 'optionalCall', _48 => _48()]);
1048
1064
  if (!server) return [];
1049
1065
  return [
1050
1066
  {
@@ -1068,57 +1084,13 @@ function listDefaultServer(input) {
1068
1084
  ];
1069
1085
  }
1070
1086
  _chunkS3JO3N4Hcjs.__name.call(void 0, listDefaultServer, "listDefaultServer");
1071
- var encoder = new TextEncoder();
1072
- var hex = /* @__PURE__ */ _chunkS3JO3N4Hcjs.__name.call(void 0, (bytes) => [...new Uint8Array(bytes)].map((byte) => byte.toString(16).padStart(2, "0")).join(""), "hex");
1073
- async function sha256Hex(value) {
1074
- return hex(await crypto.subtle.digest("SHA-256", encoder.encode(value)));
1075
- }
1076
- _chunkS3JO3N4Hcjs.__name.call(void 0, sha256Hex, "sha256Hex");
1077
- async function hmacHex(secret, message) {
1078
- const key = await crypto.subtle.importKey(
1079
- "raw",
1080
- encoder.encode(secret),
1081
- { name: "HMAC", hash: "SHA-256" },
1082
- false,
1083
- ["sign"]
1084
- );
1085
- return hex(await crypto.subtle.sign("HMAC", key, encoder.encode(message)));
1086
- }
1087
- _chunkS3JO3N4Hcjs.__name.call(void 0, hmacHex, "hmacHex");
1088
- function sameHex(a, b) {
1089
- if (a.length !== b.length) return false;
1090
- let difference = 0;
1091
- for (let index = 0; index < a.length; index++)
1092
- difference |= a.charCodeAt(index) ^ b.charCodeAt(index);
1093
- return difference === 0;
1094
- }
1095
- _chunkS3JO3N4Hcjs.__name.call(void 0, sameHex, "sameHex");
1096
- async function verifyFarmInfraManifestSignature(header, key, now = Date.now()) {
1097
- if (!header || header.length > 2048) return false;
1098
- const parts = header.split(",").map((part) => part.trim());
1099
- const timestamp = Number(
1100
- _optionalChain([/^t=(\d{1,12})$/, 'access', _47 => _47.exec, 'call', _48 => _48(_nullishCoalesce(parts.find((part) => part.startsWith("t=")), () => ( ""))), 'optionalAccess', _49 => _49[1]])
1101
- );
1102
- if (!Number.isSafeInteger(timestamp)) return false;
1103
- if (Math.abs(now / 1e3 - timestamp) > SIGNATURE_WINDOW_SECONDS) return false;
1104
- const signatures = parts.filter((part) => part.startsWith("v1=")).map((part) => part.slice(3)).filter((value) => /^[0-9a-f]{64}$/.test(value));
1105
- if (!signatures.length || signatures.length > 8) return false;
1106
- const expected = await hmacHex(await sha256Hex(key), `${SIGNED_PURPOSE}
1107
- ${timestamp}`);
1108
- return signatures.some((signature) => sameHex(signature, expected));
1109
- }
1110
- _chunkS3JO3N4Hcjs.__name.call(void 0, verifyFarmInfraManifestSignature, "verifyFarmInfraManifestSignature");
1111
- function processEnv() {
1112
- return _nullishCoalesce(_optionalChain([globalThis, 'access', _50 => _50.process, 'optionalAccess', _51 => _51.env]), () => ( {}));
1113
- }
1114
- _chunkS3JO3N4Hcjs.__name.call(void 0, processEnv, "processEnv");
1115
1087
  var CORS_HEADERS = {
1116
1088
  "access-control-allow-origin": "*",
1117
1089
  "access-control-allow-methods": "GET, HEAD, OPTIONS",
1118
- "access-control-allow-headers": `If-None-Match, ${FARM_INFRA_SIGNATURE_HEADER}`,
1090
+ "access-control-allow-headers": "If-None-Match",
1119
1091
  "access-control-expose-headers": "ETag"
1120
1092
  };
1121
- async function createFarmAppManifestResponse(request, input, options = {}) {
1093
+ async function createFarmAppManifestResponse(request, input) {
1122
1094
  const method = request.method.toUpperCase();
1123
1095
  if (method === "OPTIONS") return new Response(null, { status: 204, headers: CORS_HEADERS });
1124
1096
  if (method !== "GET" && method !== "HEAD") {
@@ -1127,23 +1099,16 @@ async function createFarmAppManifestResponse(request, input, options = {}) {
1127
1099
  headers: { ...CORS_HEADERS, allow: "GET, HEAD, OPTIONS", "content-type": "text/plain" }
1128
1100
  });
1129
1101
  }
1130
- const signature = request.headers.get(FARM_INFRA_SIGNATURE_HEADER);
1131
- const key = input.analytics ? _optionalChain([(_nullishCoalesce(options.env, () => ( processEnv()))), 'access', _52 => _52.FARMJS_API_KEY, 'optionalAccess', _53 => _53.trim, 'call', _54 => _54()]) : void 0;
1132
- const full = Boolean(
1133
- signature && key && await verifyFarmInfraManifestSignature(signature, key)
1134
- );
1135
- const body = JSON.stringify(createFarmAppManifest(input, { full }));
1102
+ const body = JSON.stringify(createFarmAppManifest(input));
1136
1103
  const etag = _chunk5NAVKJCZcjs.createFarmWeakETag.call(void 0, body);
1137
1104
  const headers = {
1138
1105
  ...CORS_HEADERS,
1139
1106
  "content-type": "application/json; charset=utf-8",
1140
- // The full view is for Infra alone; shared caches keep the two views apart.
1141
- "cache-control": full ? "private, no-store" : "public, max-age=0, must-revalidate",
1142
- vary: FARM_INFRA_SIGNATURE_HEADER,
1107
+ "cache-control": "public, max-age=0, must-revalidate",
1143
1108
  etag,
1144
1109
  "x-content-type-options": "nosniff"
1145
1110
  };
1146
- if (!full && _chunk5NAVKJCZcjs.matchesFarmIfNoneMatch.call(void 0, request.headers.get("if-none-match"), etag)) {
1111
+ if (_chunk5NAVKJCZcjs.matchesFarmIfNoneMatch.call(void 0, request.headers.get("if-none-match"), etag)) {
1147
1112
  return new Response(null, { status: 304, headers });
1148
1113
  }
1149
1114
  return new Response(method === "HEAD" ? null : body, { status: 200, headers });
@@ -1188,5 +1153,4 @@ _chunkS3JO3N4Hcjs.__name.call(void 0, createFarmAppManifestResponse, "createFarm
1188
1153
 
1189
1154
 
1190
1155
 
1191
-
1192
- exports.formatRouteSegment = formatRouteSegment; exports.createRouteDirectoryPattern = createRouteDirectoryPattern; exports.stripRouteGroups = stripRouteGroups; exports.getRouteGroupScope = getRouteGroupScope; exports.isInRouteGroupScope = isInRouteGroupScope; exports.getRouteDirectoryDepth = getRouteDirectoryDepth; exports.routeBoundaryCoversDirectory = routeBoundaryCoversDirectory; exports.HOISTED_HEAD_ELEMENT = HOISTED_HEAD_ELEMENT; exports.extractFarmFullDocument = extractFarmFullDocument; exports.classifyFarmDocumentPrefix = classifyFarmDocumentPrefix; exports.removeFarmDocumentTitles = removeFarmDocumentTitles; exports.ensureFarmDocumentMeta = ensureFarmDocumentMeta; exports.composeFarmFullDocument = composeFarmFullDocument; exports.hasFarmMiddlewareConfig = hasFarmMiddlewareConfig; exports.configMiddlewareMayHandlePath = configMiddlewareMayHandlePath; exports.appMiddlewareMayHandlePath = appMiddlewareMayHandlePath; exports.farmPathGuardCoversPage = farmPathGuardCoversPage; exports.farmPathGuardCoversEndpoint = farmPathGuardCoversEndpoint; exports.renderFarmLocaleAlternateLinks = renderFarmLocaleAlternateLinks; exports.createLateRedirectRecovery = createLateRedirectRecovery; exports.createLateNotFoundRecovery = createLateNotFoundRecovery; exports.createFarmMetadataRouteResponse = createFarmMetadataRouteResponse; exports.listFarmMCPLlmsTxtLinks = listFarmMCPLlmsTxtLinks; exports.createFarmAiCatalogResponse = createFarmAiCatalogResponse; exports.resolveDefaultErrorStatus = resolveDefaultErrorStatus; exports.getDefaultErrorStatusText = getDefaultErrorStatusText; exports.createDefaultErrorMarkup = createDefaultErrorMarkup; exports.createFarmThemeDocumentParts = createFarmThemeDocumentParts; exports.applyFarmThemeDocument = applyFarmThemeDocument; exports.FARM_API_CATALOG_PATH = FARM_API_CATALOG_PATH; exports.resolveFarmApiCatalogInput = resolveFarmApiCatalogInput; exports.createFarmApiCatalogResponse = createFarmApiCatalogResponse; exports.FARM_APP_MANIFEST_PATH = FARM_APP_MANIFEST_PATH; exports.FARM_APP_MANIFEST_LEGACY_PATH = FARM_APP_MANIFEST_LEGACY_PATH; exports.isFarmAppManifestPath = isFarmAppManifestPath; exports.FARM_INFRA_SIGNATURE_HEADER = FARM_INFRA_SIGNATURE_HEADER; exports.resolveFarmAppManifestInput = resolveFarmAppManifestInput; exports.createFarmAppManifestResponse = createFarmAppManifestResponse;
1156
+ exports.formatRouteSegment = formatRouteSegment; exports.createRouteDirectoryPattern = createRouteDirectoryPattern; exports.stripRouteGroups = stripRouteGroups; exports.getRouteGroupScope = getRouteGroupScope; exports.isInRouteGroupScope = isInRouteGroupScope; exports.getRouteDirectoryDepth = getRouteDirectoryDepth; exports.routeBoundaryCoversDirectory = routeBoundaryCoversDirectory; exports.HOISTED_HEAD_ELEMENT = HOISTED_HEAD_ELEMENT; exports.extractFarmFullDocument = extractFarmFullDocument; exports.classifyFarmDocumentPrefix = classifyFarmDocumentPrefix; exports.removeFarmDocumentTitles = removeFarmDocumentTitles; exports.ensureFarmDocumentMeta = ensureFarmDocumentMeta; exports.composeFarmFullDocument = composeFarmFullDocument; exports.hasFarmMiddlewareConfig = hasFarmMiddlewareConfig; exports.configMiddlewareMayHandlePath = configMiddlewareMayHandlePath; exports.appMiddlewareMayHandlePath = appMiddlewareMayHandlePath; exports.farmPathGuardCoversPage = farmPathGuardCoversPage; exports.farmPathGuardCoversEndpoint = farmPathGuardCoversEndpoint; exports.renderFarmLocaleAlternateLinks = renderFarmLocaleAlternateLinks; exports.createLateRedirectRecovery = createLateRedirectRecovery; exports.createLateNotFoundRecovery = createLateNotFoundRecovery; exports.createFarmMetadataRouteResponse = createFarmMetadataRouteResponse; exports.listFarmMCPLlmsTxtLinks = listFarmMCPLlmsTxtLinks; exports.createFarmAiCatalogResponse = createFarmAiCatalogResponse; exports.resolveDefaultErrorStatus = resolveDefaultErrorStatus; exports.getDefaultErrorStatusText = getDefaultErrorStatusText; exports.createDefaultErrorMarkup = createDefaultErrorMarkup; exports.createFarmThemeDocumentParts = createFarmThemeDocumentParts; exports.applyFarmThemeDocument = applyFarmThemeDocument; exports.FARM_API_CATALOG_PATH = FARM_API_CATALOG_PATH; exports.resolveFarmApiCatalogInput = resolveFarmApiCatalogInput; exports.createFarmApiCatalogResponse = createFarmApiCatalogResponse; exports.FARM_APP_MANIFEST_PATH = FARM_APP_MANIFEST_PATH; exports.FARM_APP_MANIFEST_LEGACY_PATH = FARM_APP_MANIFEST_LEGACY_PATH; exports.isFarmAppManifestPath = isFarmAppManifestPath; exports.resolveFarmAppManifestInput = resolveFarmAppManifestInput; exports.createFarmAppManifestResponse = createFarmAppManifestResponse;
@@ -1,5 +1,5 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});// package.json
2
- var version = "0.1.41";
2
+ var version = "0.1.42";
3
3
 
4
4
  // src/version.ts
5
5
  var FARM_VERSION = version;
@@ -24,7 +24,8 @@ var _chunkPSV6XKPOcjs = require('./chunk-PSV6XKPO.cjs');
24
24
 
25
25
 
26
26
 
27
- var _chunk3TB5QGUWcjs = require('./chunk-3TB5QGUW.cjs');
27
+
28
+ var _chunkJAXDRRRCcjs = require('./chunk-JAXDRRRC.cjs');
28
29
 
29
30
 
30
31
  var _chunkD5IHNDHIcjs = require('./chunk-D5IHNDHI.cjs');
@@ -145,16 +146,16 @@ function resolveFarmAgentConfig(input, context = {}) {
145
146
  const jsonLd = _optionalChain([input, 'optionalAccess', _ => _.jsonLd]);
146
147
  return {
147
148
  jsonLd: jsonLd === void 0 ? { ...DEFAULT_JSON_LD } : !jsonLd ? false : jsonLd === true ? {} : jsonLd,
148
- noindexPreviews: _chunk3TB5QGUWcjs.resolveFarmNoindexPreviews.call(void 0, _optionalChain([input, 'optionalAccess', _2 => _2.noindexPreviews])),
149
+ noindexPreviews: _chunkJAXDRRRCcjs.resolveFarmNoindexPreviews.call(void 0, _optionalChain([input, 'optionalAccess', _2 => _2.noindexPreviews])),
149
150
  // The docs engine answers /llms.txt with its own pages; a default here would replace it.
150
151
  // llms-full.txt renders every listed page, so it stays opt-in.
151
152
  llmsTxt: _chunkD5IHNDHIcjs.resolveFarmLlmsTxtConfig.call(void 0, _nullishCoalesce(_optionalChain([input, 'optionalAccess', _3 => _3.llmsTxt]), () => ( (context.docs ? false : { full: false })))),
152
153
  // Same rule as llms.txt: the docs engine answers /sitemap.xml with its own pages.
153
- sitemap: _chunk3TB5QGUWcjs.resolveFarmAgentSitemap.call(void 0, _nullishCoalesce(_optionalChain([input, 'optionalAccess', _4 => _4.sitemap]), () => ( !context.docs))),
154
- crawlers: _chunk3TB5QGUWcjs.resolveFarmAgentCrawlers.call(void 0, _optionalChain([input, 'optionalAccess', _5 => _5.crawlers])),
154
+ sitemap: _chunkJAXDRRRCcjs.resolveFarmAgentSitemap.call(void 0, _nullishCoalesce(_optionalChain([input, 'optionalAccess', _4 => _4.sitemap]), () => ( !context.docs))),
155
+ crawlers: _chunkJAXDRRRCcjs.resolveFarmAgentCrawlers.call(void 0, _optionalChain([input, 'optionalAccess', _5 => _5.crawlers])),
155
156
  apiCatalog: resolveFarmAgentBoolean(_optionalChain([input, 'optionalAccess', _6 => _6.apiCatalog]), "apiCatalog", false),
156
157
  aiCatalog: resolveFarmAgentBoolean(_optionalChain([input, 'optionalAccess', _7 => _7.aiCatalog]), "aiCatalog", true),
157
- manifest: resolveFarmAgentBoolean(_optionalChain([input, 'optionalAccess', _8 => _8.manifest]), "manifest", true),
158
+ manifest: _chunkJAXDRRRCcjs.resolveFarmAppManifestConfig.call(void 0, _optionalChain([input, 'optionalAccess', _8 => _8.manifest])),
158
159
  // Same rule as llms.txt: the docs engine serves its own MCP server at /mcp.
159
160
  mcp: resolveFarmAgentBoolean(_optionalChain([input, 'optionalAccess', _9 => _9.mcp]), "mcp", !context.docs)
160
161
  };
@@ -814,7 +815,7 @@ async function resolveConfig(userConfig, mode) {
814
815
  ], "headers"),
815
816
  routeRules,
816
817
  images: _chunkYFPGHF5Fcjs.resolveFarmImageConfig.call(void 0, userConfig.images),
817
- performance: _chunk3TB5QGUWcjs.resolveFarmPerformanceConfig.call(void 0, userConfig.performance),
818
+ performance: _chunkJAXDRRRCcjs.resolveFarmPerformanceConfig.call(void 0, userConfig.performance),
818
819
  theme: _chunkOI6CMLWXcjs.resolveFarmThemeConfig.call(void 0, userConfig.theme, basePath),
819
820
  publicDir: userConfig.publicDir || "public",
820
821
  i18n: _chunkHLJ6MBUZcjs.resolveFarmI18nConfig.call(void 0, userConfig.i18n, { root, mode, basePath }),
@@ -616,6 +616,74 @@ function applyFarmPreviewRobotsTag(response) {
616
616
  }
617
617
  __name(applyFarmPreviewRobotsTag, "applyFarmPreviewRobotsTag");
618
618
 
619
+ // src/app-manifest-config.ts
620
+ var NAME = "agent.manifest";
621
+ function isObject(value) {
622
+ return typeof value === "object" && value !== null && !Array.isArray(value);
623
+ }
624
+ __name(isObject, "isObject");
625
+ function checkKeys(value, keys, name) {
626
+ for (const key of Object.keys(value)) {
627
+ if (!keys.includes(key)) {
628
+ throw new TypeError(`${name} has an unknown option "${key}"; expected ${keys.join(", ")}.`);
629
+ }
630
+ }
631
+ }
632
+ __name(checkKeys, "checkKeys");
633
+ function readBoolean(value, name, fallback = true) {
634
+ if (value === void 0) return fallback;
635
+ if (typeof value !== "boolean") throw new TypeError(`${name} must be a boolean.`);
636
+ return value;
637
+ }
638
+ __name(readBoolean, "readBoolean");
639
+ function readHide(value, name) {
640
+ if (value === void 0) return [];
641
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string" || !entry.trim())) {
642
+ throw new TypeError(`${name} must be an array of non-empty strings.`);
643
+ }
644
+ return [...new Set(value.map((entry) => entry.trim()))];
645
+ }
646
+ __name(readHide, "readHide");
647
+ function readSection(value, name, keys, read) {
648
+ if (value === false) return false;
649
+ if (value === void 0 || value === true) return read({});
650
+ if (!isObject(value)) throw new TypeError(`${name} must be true, false, or an options object.`);
651
+ checkKeys(value, keys, name);
652
+ return read(value);
653
+ }
654
+ __name(readSection, "readSection");
655
+ function resolveFarmAppManifestConfig(input) {
656
+ if (input === false) return false;
657
+ if (input !== void 0 && input !== true && !isObject(input)) {
658
+ throw new TypeError(`${NAME} must be true, false, or an options object.`);
659
+ }
660
+ const config = isObject(input) ? input : {};
661
+ checkKeys(config, ["app", "packages", "mcp", "webmcp", "integrations", "agent", "plugins"], NAME);
662
+ const packages = config.packages;
663
+ if (packages !== void 0 && typeof packages !== "boolean" && packages !== "names") {
664
+ throw new TypeError(`${NAME}.packages must be true, false, or "names".`);
665
+ }
666
+ return {
667
+ app: readSection(config.app, `${NAME}.app`, ["version", "renderer", "build"], (app) => ({
668
+ version: readBoolean(app.version, `${NAME}.app.version`),
669
+ renderer: readBoolean(app.renderer, `${NAME}.app.renderer`),
670
+ build: readBoolean(app.build, `${NAME}.app.build`)
671
+ })),
672
+ packages: packages ?? true,
673
+ mcp: readSection(config.mcp, `${NAME}.mcp`, ["schemas", "hide"], (mcp) => ({
674
+ schemas: readBoolean(mcp.schemas, `${NAME}.mcp.schemas`),
675
+ hide: readHide(mcp.hide, `${NAME}.mcp.hide`)
676
+ })),
677
+ webmcp: readSection(config.webmcp, `${NAME}.webmcp`, ["hide"], (webmcp) => ({
678
+ hide: readHide(webmcp.hide, `${NAME}.webmcp.hide`)
679
+ })),
680
+ integrations: readBoolean(config.integrations, `${NAME}.integrations`),
681
+ agent: readBoolean(config.agent, `${NAME}.agent`),
682
+ plugins: readBoolean(config.plugins, `${NAME}.plugins`)
683
+ };
684
+ }
685
+ __name(resolveFarmAppManifestConfig, "resolveFarmAppManifestConfig");
686
+
619
687
  export {
620
688
  resolveFarmAgentCrawlers,
621
689
  createFarmAgentRobots,
@@ -626,6 +694,7 @@ export {
626
694
  manageFarmLinkHeaderPreloads,
627
695
  manageFarmDocumentPreloads,
628
696
  reportFarmPreloadWarnings,
697
+ resolveFarmAppManifestConfig,
629
698
  FARM_PREVIEW_ROBOTS_TAG,
630
699
  resolveFarmNoindexPreviews,
631
700
  applyFarmPreviewRobotsTag
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  getRouteGroupScope,
9
9
  isInRouteGroupScope
10
- } from "./chunk-SVPGWJZF.mjs";
10
+ } from "./chunk-PIZXONIS.mjs";
11
11
  import {
12
12
  __name
13
13
  } from "./chunk-LPEX4YW6.mjs";
@@ -616,6 +616,75 @@ function applyFarmPreviewRobotsTag(response) {
616
616
  }
617
617
  _chunkS3JO3N4Hcjs.__name.call(void 0, applyFarmPreviewRobotsTag, "applyFarmPreviewRobotsTag");
618
618
 
619
+ // src/app-manifest-config.ts
620
+ var NAME = "agent.manifest";
621
+ function isObject(value) {
622
+ return typeof value === "object" && value !== null && !Array.isArray(value);
623
+ }
624
+ _chunkS3JO3N4Hcjs.__name.call(void 0, isObject, "isObject");
625
+ function checkKeys(value, keys, name) {
626
+ for (const key of Object.keys(value)) {
627
+ if (!keys.includes(key)) {
628
+ throw new TypeError(`${name} has an unknown option "${key}"; expected ${keys.join(", ")}.`);
629
+ }
630
+ }
631
+ }
632
+ _chunkS3JO3N4Hcjs.__name.call(void 0, checkKeys, "checkKeys");
633
+ function readBoolean(value, name, fallback = true) {
634
+ if (value === void 0) return fallback;
635
+ if (typeof value !== "boolean") throw new TypeError(`${name} must be a boolean.`);
636
+ return value;
637
+ }
638
+ _chunkS3JO3N4Hcjs.__name.call(void 0, readBoolean, "readBoolean");
639
+ function readHide(value, name) {
640
+ if (value === void 0) return [];
641
+ if (!Array.isArray(value) || value.some((entry) => typeof entry !== "string" || !entry.trim())) {
642
+ throw new TypeError(`${name} must be an array of non-empty strings.`);
643
+ }
644
+ return [...new Set(value.map((entry) => entry.trim()))];
645
+ }
646
+ _chunkS3JO3N4Hcjs.__name.call(void 0, readHide, "readHide");
647
+ function readSection(value, name, keys, read) {
648
+ if (value === false) return false;
649
+ if (value === void 0 || value === true) return read({});
650
+ if (!isObject(value)) throw new TypeError(`${name} must be true, false, or an options object.`);
651
+ checkKeys(value, keys, name);
652
+ return read(value);
653
+ }
654
+ _chunkS3JO3N4Hcjs.__name.call(void 0, readSection, "readSection");
655
+ function resolveFarmAppManifestConfig(input) {
656
+ if (input === false) return false;
657
+ if (input !== void 0 && input !== true && !isObject(input)) {
658
+ throw new TypeError(`${NAME} must be true, false, or an options object.`);
659
+ }
660
+ const config = isObject(input) ? input : {};
661
+ checkKeys(config, ["app", "packages", "mcp", "webmcp", "integrations", "agent", "plugins"], NAME);
662
+ const packages = config.packages;
663
+ if (packages !== void 0 && typeof packages !== "boolean" && packages !== "names") {
664
+ throw new TypeError(`${NAME}.packages must be true, false, or "names".`);
665
+ }
666
+ return {
667
+ app: readSection(config.app, `${NAME}.app`, ["version", "renderer", "build"], (app) => ({
668
+ version: readBoolean(app.version, `${NAME}.app.version`),
669
+ renderer: readBoolean(app.renderer, `${NAME}.app.renderer`),
670
+ build: readBoolean(app.build, `${NAME}.app.build`)
671
+ })),
672
+ packages: _nullishCoalesce(packages, () => ( true)),
673
+ mcp: readSection(config.mcp, `${NAME}.mcp`, ["schemas", "hide"], (mcp) => ({
674
+ schemas: readBoolean(mcp.schemas, `${NAME}.mcp.schemas`),
675
+ hide: readHide(mcp.hide, `${NAME}.mcp.hide`)
676
+ })),
677
+ webmcp: readSection(config.webmcp, `${NAME}.webmcp`, ["hide"], (webmcp) => ({
678
+ hide: readHide(webmcp.hide, `${NAME}.webmcp.hide`)
679
+ })),
680
+ integrations: readBoolean(config.integrations, `${NAME}.integrations`),
681
+ agent: readBoolean(config.agent, `${NAME}.agent`),
682
+ plugins: readBoolean(config.plugins, `${NAME}.plugins`)
683
+ };
684
+ }
685
+ _chunkS3JO3N4Hcjs.__name.call(void 0, resolveFarmAppManifestConfig, "resolveFarmAppManifestConfig");
686
+
687
+
619
688
 
620
689
 
621
690
 
@@ -629,4 +698,4 @@ _chunkS3JO3N4Hcjs.__name.call(void 0, applyFarmPreviewRobotsTag, "applyFarmPrevi
629
698
 
630
699
 
631
700
 
632
- exports.resolveFarmAgentCrawlers = resolveFarmAgentCrawlers; exports.createFarmAgentRobots = createFarmAgentRobots; exports.resolveFarmAgentSitemap = resolveFarmAgentSitemap; exports.createFarmDefaultSitemap = createFarmDefaultSitemap; exports.resolveFarmPerformanceConfig = resolveFarmPerformanceConfig; exports.manageFarmHtmlPreloads = manageFarmHtmlPreloads; exports.manageFarmLinkHeaderPreloads = manageFarmLinkHeaderPreloads; exports.manageFarmDocumentPreloads = manageFarmDocumentPreloads; exports.reportFarmPreloadWarnings = reportFarmPreloadWarnings; exports.FARM_PREVIEW_ROBOTS_TAG = FARM_PREVIEW_ROBOTS_TAG; exports.resolveFarmNoindexPreviews = resolveFarmNoindexPreviews; exports.applyFarmPreviewRobotsTag = applyFarmPreviewRobotsTag;
701
+ exports.resolveFarmAgentCrawlers = resolveFarmAgentCrawlers; exports.createFarmAgentRobots = createFarmAgentRobots; exports.resolveFarmAgentSitemap = resolveFarmAgentSitemap; exports.createFarmDefaultSitemap = createFarmDefaultSitemap; exports.resolveFarmPerformanceConfig = resolveFarmPerformanceConfig; exports.manageFarmHtmlPreloads = manageFarmHtmlPreloads; exports.manageFarmLinkHeaderPreloads = manageFarmLinkHeaderPreloads; exports.manageFarmDocumentPreloads = manageFarmDocumentPreloads; exports.reportFarmPreloadWarnings = reportFarmPreloadWarnings; exports.resolveFarmAppManifestConfig = resolveFarmAppManifestConfig; exports.FARM_PREVIEW_ROBOTS_TAG = FARM_PREVIEW_ROBOTS_TAG; exports.resolveFarmNoindexPreviews = resolveFarmNoindexPreviews; exports.applyFarmPreviewRobotsTag = applyFarmPreviewRobotsTag;