{"version":3,"sources":["../src/renderer-client.ts","../src/routing/specificity.ts","../src/router.ts","../src/deferred.ts","../src/client/history-sync.ts","../src/deployment.ts","../src/client/hash-target.ts","../src/client/navigation-url.ts","../src/agent-config.ts","../src/metadata.ts","../src/client/metadata-reconciler.ts","../src/i18n/client-runtime.ts","../src/i18n/bridge.ts","../src/base-path.ts","../src/i18n/routing.ts","../src/client/spa-router.ts","../src/tracing.ts","../src/observability.ts","../src/cache-invalidation.ts","../src/cache.ts","../src/client-cache.ts","../src/client-revalidation.ts","../src/server-query-runtime.ts","../src/theme/runtime.ts","../src/i18n/resolver.ts"],"sourcesContent":["\"use client\";\n\nimport { createFarmRouter, type FarmRouter, type FarmRouterRouteInput } from \"./router\";\nimport {\n  getRouter as getSPARouter,\n  readPageState,\n  type FarmNavigationState,\n  type FarmNavigateOptions,\n} from \"./client/spa-router\";\nimport { subscribeHistoryChange } from \"./client/history-sync\";\nimport { getFarmClientDataCache, type FarmClientCacheStatus } from \"./client-cache\";\nimport { attachRevalidationListeners } from \"./client-revalidation\";\nimport type { ServerFn } from \"./server-fn\";\nimport type { ServerQuery } from \"./server-query\";\nimport {\n  createServerQueryCallKey,\n  fetchServerQuery,\n  type ServerQueryFetchOptions,\n} from \"./server-query-runtime\";\nimport { getTheme, setTheme, subscribeTheme, toggleTheme } from \"./theme/runtime\";\nimport type { FarmThemePreference, FarmThemeSnapshot } from \"./theme/types\";\nimport { createFarmLocaleCookie } from \"./i18n/resolver\";\nimport { localizeFarmHref, stripFarmLocaleFromPathname } from \"./i18n/routing\";\nimport {\n  createFarmClientTranslator,\n  getFarmI18nClientState,\n  subscribeFarmI18n,\n} from \"./i18n/client-runtime\";\nimport type { FarmI18nClientSnapshot, FarmI18nLocale, FarmTranslator } from \"./i18n/types\";\n\nexport type { FarmI18nClientSnapshot, FarmI18nLocale, FarmTranslator } from \"./i18n/types\";\nimport {\n  applyFarmBasePath,\n  getFarmBasePath,\n  normalizeFarmBasePath,\n  stripFarmBasePath,\n} from \"./base-path\";\n\nexport interface FarmClientStore<TSnapshot> {\n  getSnapshot(): TSnapshot;\n  subscribe(listener: () => void): () => void;\n}\n\nexport interface FarmRendererRouterOptions {\n  basePath?: string;\n  routes?: readonly FarmRouterRouteInput[];\n}\n\nexport interface FarmRendererRouterSnapshot {\n  pathname: string;\n  searchParams: URLSearchParams;\n  params: Record<string, string>;\n  pageState: unknown;\n  navigation: FarmNavigationState;\n}\n\nexport interface FarmRendererRouter extends FarmClientStore<FarmRendererRouterSnapshot> {\n  push(href: string, options?: Omit<FarmNavigateOptions, \"replace\">): Promise<void>;\n  replace(href: string, options?: Omit<FarmNavigateOptions, \"replace\">): Promise<void>;\n  refresh(options?: Omit<FarmNavigateOptions, \"replace\" | \"refresh\">): Promise<void>;\n  prefetch(href: string): Promise<void>;\n  back(): void;\n  forward(): void;\n  pushState<TState>(state: TState, href?: string): void;\n  replaceState<TState>(state: TState, href?: string): void;\n}\n\nexport function createRendererRouter(options: FarmRendererRouterOptions = {}): FarmRendererRouter {\n  const basePath =\n    options.basePath === undefined ? getFarmBasePath() : normalizeFarmBasePath(options.basePath);\n  const matcher = options.routes?.length ? createFarmRouter([...options.routes]) : null;\n  const router = getSPARouter();\n  let snapshot = readRendererRouterSnapshot(basePath, matcher, router.getNavigationState());\n\n  const read = () => {\n    snapshot = readRendererRouterSnapshot(basePath, matcher, router.getNavigationState());\n    return snapshot;\n  };\n\n  return {\n    getSnapshot: () => snapshot,\n    subscribe(listener) {\n      if (typeof window === \"undefined\") return () => {};\n      const notify = () => {\n        read();\n        listener();\n      };\n      const unsubscribeNavigation = router.subscribeNavigation(notify);\n      const unsubscribeHistory = subscribeHistoryChange(notify);\n      read();\n      return () => {\n        unsubscribeNavigation();\n        unsubscribeHistory();\n      };\n    },\n    push(href, navigateOptions) {\n      return typeof window === \"undefined\"\n        ? Promise.resolve()\n        : router.navigate(resolveRendererHref(href, basePath), navigateOptions);\n    },\n    replace(href, navigateOptions) {\n      return typeof window === \"undefined\"\n        ? Promise.resolve()\n        : router.navigate(resolveRendererHref(href, basePath), {\n            ...navigateOptions,\n            replace: true,\n          });\n    },\n    refresh: (refreshOptions) =>\n      typeof window === \"undefined\" ? Promise.resolve() : router.refresh(refreshOptions),\n    prefetch: (href) =>\n      typeof window === \"undefined\"\n        ? Promise.resolve()\n        : router.prefetch(resolveRendererHref(href, basePath)),\n    back() {\n      if (typeof window !== \"undefined\") window.history.back();\n    },\n    forward() {\n      if (typeof window !== \"undefined\") window.history.forward();\n    },\n    pushState(state, href) {\n      if (typeof window !== \"undefined\") {\n        router.pushState(state, href && resolveRendererHref(href, basePath));\n        read();\n      }\n    },\n    replaceState(state, href) {\n      if (typeof window !== \"undefined\") {\n        router.replaceState(state, href && resolveRendererHref(href, basePath));\n        read();\n      }\n    },\n  };\n}\n\nexport type FarmActionStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport interface FarmActionSnapshot<TResult, TError extends Error = Error> {\n  pending: boolean;\n  status: FarmActionStatus;\n  data: TResult | null;\n  error: TError | null;\n}\n\nexport interface FarmActionOptions<TInput, TResult, TError extends Error = Error> {\n  initialResult?: TResult | null;\n  resetOnSubmit?: boolean;\n  optimistic?: (context: {\n    input: TInput | FormData | undefined;\n    formData?: FormData;\n    current: TResult | null;\n  }) => TResult | null | undefined;\n  rollbackOnError?: boolean;\n  onSuccess?: (result: TResult) => void;\n  onError?: (error: TError) => void;\n  onSettled?: (result: TResult | null, error: TError | null) => void;\n}\n\nexport type FarmActionSubmit<TInput, TResult> = [unknown] extends [TInput]\n  ? (input?: TInput | FormData) => Promise<TResult>\n  : (input: TInput | FormData) => Promise<TResult>;\n\nexport type FarmAction<TInput, TResult, TError extends Error = Error> = FarmClientStore<\n  FarmActionSnapshot<TResult, TError>\n> & {\n  submit: FarmActionSubmit<TInput, TResult>;\n  reset(): void;\n};\n\nexport type FarmRouteActionTarget<TServerFn extends ServerFn<any, any, any>> = {\n  readonly action: TServerFn;\n};\n\nexport function createRendererAction<TInput, TResult, TError extends Error = Error>(\n  target:\n    | ServerFn<TInput, TResult, TError>\n    | FarmRouteActionTarget<ServerFn<TInput, TResult, TError>>,\n  options: FarmActionOptions<TInput, TResult, TError> = {},\n): FarmAction<TInput, TResult, TError> {\n  const serverFn = resolveRendererServerFn(target);\n  const listeners = new Set<() => void>();\n  const initialResult = options.initialResult ?? null;\n  let requestId = 0;\n  let pendingCount = 0;\n  let latestSettledStatus: FarmActionSnapshot<TResult, TError>[\"status\"] = \"idle\";\n  let snapshot: FarmActionSnapshot<TResult, TError> = {\n    pending: false,\n    status: \"idle\",\n    data: initialResult,\n    error: null,\n  };\n\n  const update = (next: FarmActionSnapshot<TResult, TError>) => {\n    snapshot = next;\n    for (const listener of listeners) listener();\n  };\n\n  return {\n    getSnapshot: () => snapshot,\n    subscribe(listener) {\n      listeners.add(listener);\n      return () => listeners.delete(listener);\n    },\n    async submit(input?: TInput | FormData) {\n      const currentRequest = ++requestId;\n      const previous = snapshot.data;\n      const formData = isRendererFormData(input) ? input : undefined;\n      const optimistic = options.optimistic?.({ input, formData, current: previous });\n      const hasOptimistic = optimistic !== undefined;\n      pendingCount += 1;\n      update({\n        pending: true,\n        status: \"pending\",\n        data: hasOptimistic ? optimistic : options.resetOnSubmit === false ? previous : null,\n        error: null,\n      });\n\n      try {\n        const result = await serverFn(input as TInput | FormData);\n        pendingCount = Math.max(0, pendingCount - 1);\n        if (currentRequest === requestId) {\n          latestSettledStatus = \"success\";\n          update({\n            pending: pendingCount > 0,\n            status: pendingCount > 0 ? \"pending\" : \"success\",\n            data: result,\n            error: null,\n          });\n          options.onSuccess?.(result);\n          options.onSettled?.(result, null);\n        } else if (pendingCount === 0) {\n          update({ ...snapshot, pending: false, status: latestSettledStatus });\n        }\n        return result;\n      } catch (cause) {\n        pendingCount = Math.max(0, pendingCount - 1);\n        const error = normalizeRendererClientError(cause) as TError;\n        if (currentRequest === requestId) {\n          latestSettledStatus = \"error\";\n          update({\n            pending: pendingCount > 0,\n            status: pendingCount > 0 ? \"pending\" : \"error\",\n            data:\n              hasOptimistic && options.rollbackOnError\n                ? previous\n                : options.resetOnSubmit === false\n                  ? snapshot.data\n                  : null,\n            error,\n          });\n          options.onError?.(error);\n          options.onSettled?.(null, error);\n        } else if (pendingCount === 0) {\n          update({ ...snapshot, pending: false, status: latestSettledStatus });\n        }\n        throw error;\n      }\n    },\n    reset() {\n      requestId += 1;\n      pendingCount = 0;\n      latestSettledStatus = \"idle\";\n      update({ pending: false, status: \"idle\", data: initialResult, error: null });\n    },\n  } as FarmAction<TInput, TResult, TError>;\n}\n\nexport interface FarmRendererQueryOptions extends ServerQueryFetchOptions {\n  enabled?: boolean;\n  refetchOnWindowFocus?: boolean;\n  refetchOnReconnect?: boolean;\n}\n\nexport interface FarmRendererQuerySnapshot<TData> {\n  data: TData | undefined;\n  error: Error | null;\n  status: FarmClientCacheStatus;\n  pending: boolean;\n  fetching: boolean;\n  stale: boolean;\n}\n\nexport interface FarmRendererQuery<TData> extends FarmClientStore<\n  FarmRendererQuerySnapshot<TData>\n> {\n  refetch(): Promise<TData>;\n  dispose(): void;\n}\n\nexport function createRendererQuery<TInput, TData>(\n  query: ServerQuery<TInput, TData>,\n  input: TInput,\n  options: FarmRendererQueryOptions = {},\n): FarmRendererQuery<TData> {\n  const cache = getFarmClientDataCache();\n  const key = createServerQueryCallKey(query, input);\n  const listeners = new Set<() => void>();\n  let unsubscribeCache: (() => void) | undefined;\n  let cleanupBrowser: (() => void) | undefined;\n\n  const run = (force = false) => fetchServerQuery(query, input, { ...options, force });\n  const ensureStarted = () => {\n    if (options.enabled === false || unsubscribeCache) return;\n    unsubscribeCache = cache.subscribe(key, () => {\n      for (const listener of listeners) listener();\n    });\n    if (!cache.get(key) || cache.isStale(key)) void run().catch(() => undefined);\n\n    cleanupBrowser = attachRevalidationListeners(\n      () => {\n        if (cache.isStale(key)) void run().catch(() => undefined);\n      },\n      {\n        refetchOnWindowFocus: options.refetchOnWindowFocus,\n        refetchOnReconnect: options.refetchOnReconnect,\n      },\n    );\n  };\n\n  return {\n    getSnapshot() {\n      const entry = cache.get<TData>(key);\n      const status = entry?.status ?? (entry ? \"success\" : \"idle\");\n      return {\n        data: entry?.data,\n        error: entry?.error ?? null,\n        status,\n        pending: status === \"pending\" && (entry?.updatedAt ?? 0) === 0,\n        fetching: entry?.fetching ?? false,\n        stale: cache.isStale(key),\n      };\n    },\n    subscribe(listener) {\n      listeners.add(listener);\n      ensureStarted();\n      return () => listeners.delete(listener);\n    },\n    refetch: () => run(true),\n    dispose() {\n      unsubscribeCache?.();\n      cleanupBrowser?.();\n      unsubscribeCache = undefined;\n      cleanupBrowser = undefined;\n      listeners.clear();\n    },\n  };\n}\n\nexport interface FarmRendererTheme extends FarmClientStore<FarmThemeSnapshot> {\n  setTheme(theme: FarmThemePreference): void;\n  toggleTheme(): FarmThemeSnapshot[\"resolvedTheme\"];\n}\n\nexport function createRendererTheme(): FarmRendererTheme {\n  return {\n    getSnapshot: getTheme,\n    subscribe: subscribeTheme,\n    setTheme,\n    toggleTheme,\n  };\n}\n\nexport interface FarmRendererI18n extends FarmClientStore<FarmI18nClientSnapshot | undefined> {\n  readonly t: FarmTranslator;\n  setLocale(locale: FarmI18nLocale): void;\n}\n\nexport function createRendererI18n(): FarmRendererI18n {\n  return {\n    getSnapshot: getFarmI18nClientState,\n    subscribe: subscribeFarmI18n,\n    t: createFarmClientTranslator(),\n    setLocale(locale) {\n      const snapshot = getFarmI18nClientState();\n      if (!snapshot) throw new Error(\"Farm i18n is not configured or has not been hydrated.\");\n      if (!snapshot.locales.includes(locale)) {\n        throw new Error(`Unsupported Farm i18n locale \"${locale}\".`);\n      }\n      if (typeof window === \"undefined\") return;\n      document.cookie = createFarmLocaleCookie(locale, { cookie: snapshot.cookie });\n      const href = `${window.location.pathname}${window.location.search}${window.location.hash}`;\n      window.location.assign(localizeFarmHref(href, locale, snapshot));\n    },\n  };\n}\n\nfunction readRendererRouterSnapshot(\n  basePath: string,\n  matcher: FarmRouter | null,\n  navigation: FarmNavigationState,\n): FarmRendererRouterSnapshot {\n  if (typeof window === \"undefined\") {\n    return {\n      pathname: \"/\",\n      searchParams: new URLSearchParams(),\n      params: {},\n      pageState: null,\n      navigation,\n    };\n  }\n\n  const url = new URL(window.location.href);\n  const pathname = stripFarmBasePath(url.pathname, basePath);\n  const i18n = getFarmI18nClientState();\n  const routePathname = i18n ? stripFarmLocaleFromPathname(pathname, i18n) : pathname;\n\n  return {\n    pathname,\n    searchParams: url.searchParams,\n    params: matcher?.match(routePathname)?.params || {},\n    pageState: readPageState(),\n    navigation,\n  };\n}\n\nfunction resolveRendererHref(href: string, basePath: string): string {\n  return applyFarmBasePath(href, basePath);\n}\n\nfunction resolveRendererServerFn<TInput, TResult, TError extends Error>(\n  target:\n    | ServerFn<TInput, TResult, TError>\n    | FarmRouteActionTarget<ServerFn<TInput, TResult, TError>>,\n): ServerFn<TInput, TResult, TError> {\n  if (typeof target === \"function\") return target;\n  if (target && typeof target.action === \"function\") return target.action;\n  throw new TypeError(\n    \"createRendererAction requires a server function or a route with a declared action\",\n  );\n}\n\nfunction normalizeRendererClientError(cause: unknown): Error {\n  if (cause instanceof Error) return cause;\n  const error = new Error(typeof cause === \"string\" ? cause : \"FARMJS client operation failed\");\n  (error as Error & { cause?: unknown }).cause = cause;\n  return error;\n}\n\nfunction isRendererFormData(value: unknown): value is FormData {\n  return typeof FormData !== \"undefined\" && value instanceof FormData;\n}\n","export type RouteSegmentSpecificity = \"static\" | \"dynamic\" | \"catch-all\" | \"optional-catch-all\";\n\nexport class AmbiguousRouteError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"AmbiguousRouteError\";\n  }\n}\n\nexport class NonTerminalCatchAllRouteError extends TypeError {\n  constructor(message: string) {\n    super(message);\n    this.name = \"NonTerminalCatchAllRouteError\";\n  }\n}\n\nexport class DuplicateRouteParameterError extends AmbiguousRouteError {\n  constructor(message: string) {\n    super(message);\n    this.name = \"DuplicateRouteParameterError\";\n  }\n}\n\nexport class ReservedRouteParameterError extends AmbiguousRouteError {\n  constructor(message: string) {\n    super(message);\n    this.name = \"ReservedRouteParameterError\";\n  }\n}\n\nexport class BrowserUnstableRouteError extends TypeError {\n  constructor(message: string) {\n    super(message);\n    this.name = \"BrowserUnstableRouteError\";\n  }\n}\n\nconst SEGMENT_RANK: Record<RouteSegmentSpecificity, number> = {\n  static: 4,\n  dynamic: 3,\n  \"catch-all\": 1,\n  \"optional-catch-all\": 0,\n};\n\n// Ending a route is more specific than consuming the same path through a\n// catch-all, while a following static or dynamic segment remains more specific.\nconst ROUTE_END_RANK = 2;\n\n/** Sort route patterns from the most specific segment sequence to the least specific. */\nexport function compareRouteSpecificity(\n  left: readonly RouteSegmentSpecificity[],\n  right: readonly RouteSegmentSpecificity[],\n): number {\n  const length = Math.max(left.length, right.length);\n\n  for (let index = 0; index < length; index++) {\n    const leftRank = index < left.length ? SEGMENT_RANK[left[index]!] : ROUTE_END_RANK;\n    const rightRank = index < right.length ? SEGMENT_RANK[right[index]!] : ROUTE_END_RANK;\n    if (leftRank !== rightRank) return rightRank - leftRank;\n  }\n\n  return 0;\n}\n\nexport type RoutePatternSyntax = \"page\" | \"router\" | \"api\";\n\nconst ROUTER_PARAMETER_NAME = \"[A-Za-z0-9_$-]+\";\nconst PAGE_PARAMETER_PATTERN = /^(?:\\[\\[\\.\\.\\.(.+)\\]\\]|\\[\\.\\.\\.(.+)\\]|\\[(.+)\\])$/;\nconst ROUTER_PARAMETER_PATTERN =\n  /^(?:\\[\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]\\]|\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]|\\[([A-Za-z0-9_$-]+)\\]|:([A-Za-z0-9_$-]+)|\\*([A-Za-z0-9_$-]+)\\??)$/;\nconst RESERVED_PARAMETER_NAMES = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nexport function assertBrowserStableRoutePath(pattern: string): void {\n  if (pattern.includes(\"\\\\\") || hasControlCharacter(pattern)) {\n    throw new BrowserUnstableRouteError(\n      `Route path \"${pattern}\" cannot contain backslashes or control characters.`,\n    );\n  }\n\n  for (const segment of pattern.split(\"/\").filter(Boolean)) {\n    if (\n      (segment.startsWith(\"(\") && segment.endsWith(\")\")) ||\n      (segment.startsWith(\"[\") && segment.endsWith(\"]\"))\n    ) {\n      continue;\n    }\n\n    let decoded = segment;\n    try {\n      decoded = decodeURIComponent(segment);\n    } catch {\n      // Malformed escapes stay literal in browser pathnames.\n    }\n    if (\n      decoded === \".\" ||\n      decoded === \"..\" ||\n      decoded.includes(\"/\") ||\n      decoded.includes(\"\\\\\") ||\n      hasControlCharacter(decoded)\n    ) {\n      throw new BrowserUnstableRouteError(\n        `Route path \"${pattern}\" contains browser-unstable segment \"${segment}\".`,\n      );\n    }\n  }\n}\n\nfunction hasControlCharacter(value: string): boolean {\n  return Array.from(value).some((character) => {\n    const code = character.charCodeAt(0);\n    return code <= 31 || (code >= 127 && code <= 159);\n  });\n}\n\nexport function assertUniqueRouteParameters(\n  pattern: string,\n  syntax: RoutePatternSyntax = \"page\",\n): void {\n  const parameterPattern = syntax === \"router\" ? ROUTER_PARAMETER_PATTERN : PAGE_PARAMETER_PATTERN;\n  const names = new Set<string>();\n\n  for (const segment of splitRoutePattern(pattern, syntax)) {\n    const match = parameterPattern.exec(segment);\n    const name = match?.slice(1).find(Boolean);\n    if (!name) continue;\n    if (RESERVED_PARAMETER_NAMES.has(name)) {\n      throw new ReservedRouteParameterError(\n        `Route parameter \"${name}\" in route \"${pattern}\" is reserved. Use a different parameter name.`,\n      );\n    }\n    if (names.has(name)) {\n      throw new DuplicateRouteParameterError(\n        `Duplicate route parameter \"${name}\" in route \"${pattern}\". Each dynamic segment must use a unique name.`,\n      );\n    }\n    names.add(name);\n  }\n}\n\nfunction splitRoutePattern(pattern: string, syntax: RoutePatternSyntax): string[] {\n  return pattern\n    .replace(/\\\\/g, \"/\")\n    .split(\"/\")\n    .filter(Boolean)\n    .filter((segment) =>\n      syntax === \"api\" ? true : !(segment.startsWith(\"(\") && segment.endsWith(\")\")),\n    );\n}\n\nexport function assertTerminalCatchAll(pattern: string, syntax: RoutePatternSyntax = \"page\"): void {\n  const segments = splitRoutePattern(pattern, syntax);\n  const parameterName = syntax === \"router\" ? ROUTER_PARAMETER_NAME : \".+\";\n  const catchAllPattern = new RegExp(\n    syntax === \"router\"\n      ? `^(?:\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]|\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]|\\\\*${parameterName}\\\\??)$`\n      : `^(?:\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]|\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\])$`,\n  );\n  const catchAllIndex = segments.findIndex((segment) => catchAllPattern.test(segment));\n  if (catchAllIndex >= 0 && catchAllIndex !== segments.length - 1) {\n    throw new NonTerminalCatchAllRouteError(\n      `Catch-all segment \"${segments[catchAllIndex]}\" must be the final segment in route \"${pattern}\".`,\n    );\n  }\n}\n\n/** Return the URL-matching shape of a route without its parameter names. */\nexport function getRoutePatternShape(pattern: string, syntax: RoutePatternSyntax = \"page\"): string {\n  assertTerminalCatchAll(pattern, syntax);\n  const segments = splitRoutePattern(pattern, syntax).map((segment) => {\n    const specificity = getPatternSegmentSpecificity(segment, syntax);\n    if (specificity !== \"static\") return specificity;\n\n    try {\n      return `static:${decodeURIComponent(segment)}`;\n    } catch {\n      return `static:${segment}`;\n    }\n  });\n\n  return segments.length === 0 ? \"/\" : JSON.stringify(segments);\n}\n\n/** Return the specificity of every URL-consuming segment in a route pattern. */\nexport function getRoutePatternSpecificity(\n  pattern: string,\n  syntax: RoutePatternSyntax = \"page\",\n): RouteSegmentSpecificity[] {\n  assertTerminalCatchAll(pattern, syntax);\n  return splitRoutePattern(pattern, syntax).map((segment) =>\n    getPatternSegmentSpecificity(segment, syntax),\n  );\n}\n\nfunction getPatternSegmentSpecificity(\n  segment: string,\n  syntax: RoutePatternSyntax,\n): RouteSegmentSpecificity {\n  const parameterName = syntax === \"router\" ? ROUTER_PARAMETER_NAME : \".+\";\n  const supportsColonAndStar = syntax === \"router\";\n  if (\n    new RegExp(`^\\\\[\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]\\\\]$`).test(segment) ||\n    (supportsColonAndStar && new RegExp(`^\\\\*${parameterName}\\\\?$`).test(segment))\n  ) {\n    return \"optional-catch-all\";\n  }\n  if (\n    new RegExp(`^\\\\[\\\\.\\\\.\\\\.${parameterName}\\\\]$`).test(segment) ||\n    (supportsColonAndStar && new RegExp(`^\\\\*${parameterName}$`).test(segment))\n  ) {\n    return \"catch-all\";\n  }\n  if (\n    new RegExp(`^\\\\[${parameterName}\\\\]$`).test(segment) ||\n    (supportsColonAndStar && new RegExp(`^:${parameterName}$`).test(segment))\n  ) {\n    return \"dynamic\";\n  }\n\n  return \"static\";\n}\n","import {\n  AmbiguousRouteError,\n  assertTerminalCatchAll,\n  assertUniqueRouteParameters,\n  compareRouteSpecificity,\n  getRoutePatternShape,\n  type RouteSegmentSpecificity,\n} from \"./routing/specificity\";\n\nexport type FarmRouterPrimitiveParam = string | number | boolean;\nexport type FarmRouterPathParam =\n  | FarmRouterPrimitiveParam\n  | readonly FarmRouterPrimitiveParam[]\n  | null\n  | undefined;\nexport type FarmRouterPathParams = Record<string, FarmRouterPathParam>;\nexport type FarmRouterParams = Record<string, string>;\n\nexport interface FarmRouterRoute<TMeta = unknown> {\n  path: string;\n  name?: string;\n  meta?: TMeta;\n}\n\nexport type FarmRouterRouteInput<TMeta = unknown> = string | FarmRouterRoute<TMeta>;\n\nexport interface FarmRouterMatch<TMeta = unknown> {\n  route: FarmRouterRoute<TMeta>;\n  pathname: string;\n  params: FarmRouterParams;\n}\n\nexport type FarmRouterQueryValue =\n  | FarmRouterPrimitiveParam\n  | readonly FarmRouterPrimitiveParam[]\n  | null\n  | undefined;\n\nexport interface FarmRouterBuildOptions {\n  query?: URLSearchParams | Record<string, FarmRouterQueryValue>;\n  hash?: string;\n  trailingSlash?: boolean;\n}\n\nexport interface FarmRouterActiveOptions {\n  exact?: boolean;\n}\n\nexport interface FarmRouter<TMeta = unknown> {\n  routes: FarmRouterRoute<TMeta>[];\n  match(pathname: string): FarmRouterMatch<TMeta> | null;\n  build(pattern: string, params?: FarmRouterPathParams, options?: FarmRouterBuildOptions): string;\n  isActive(pattern: string, pathname: string, options?: FarmRouterActiveOptions): boolean;\n}\n\ntype RouterSegment =\n  | {\n      type: \"static\";\n      value: string;\n    }\n  | {\n      type: \"dynamic\";\n      name: string;\n      catchAll: boolean;\n      optional: boolean;\n    };\n\ninterface NormalizedRouterRoute<TMeta> {\n  route: FarmRouterRoute<TMeta>;\n  segments: RouterSegment[];\n  specificity: RouteSegmentSpecificity[];\n  index: number;\n}\n\nexport function createFarmRouter<TMeta = unknown>(\n  routes: FarmRouterRouteInput<TMeta>[],\n): FarmRouter<TMeta> {\n  const normalizedRoutes = routes.map(normalizeRouteInput);\n  const patternsByShape = new Map<string, string>();\n  for (const entry of normalizedRoutes) {\n    const shape = getRoutePatternShape(entry.route.path, \"router\");\n    const existingPattern = patternsByShape.get(shape);\n    if (existingPattern) {\n      throw new AmbiguousRouteError(\n        `Ambiguous route patterns \"${existingPattern}\" and \"${entry.route.path}\" match the same URLs. Keep only one route for this URL shape.`,\n      );\n    }\n    patternsByShape.set(shape, entry.route.path);\n  }\n  normalizedRoutes.sort(compareRoutes);\n\n  return {\n    routes: normalizedRoutes.map((entry) => entry.route),\n    match(pathname) {\n      const normalizedPathname = normalizePathname(pathname);\n\n      for (const entry of normalizedRoutes) {\n        const params = matchSegments(entry.segments, normalizedPathname);\n        if (params) {\n          return {\n            route: entry.route,\n            pathname: normalizedPathname,\n            params,\n          };\n        }\n      }\n\n      return null;\n    },\n    build: buildFarmRoutePath,\n    isActive: isFarmRouteActive,\n  };\n}\n\nexport function matchFarmRoute(pattern: string, pathname: string): FarmRouterParams | null {\n  return matchSegments(parseRoutePattern(pattern), normalizePathname(pathname));\n}\n\nexport function buildFarmRoutePath(\n  pattern: string,\n  params: FarmRouterPathParams = {},\n  options: FarmRouterBuildOptions = {},\n): string {\n  const parts: string[] = [];\n\n  for (const segment of parseRoutePattern(pattern)) {\n    if (segment.type === \"static\") {\n      parts.push(encodePathSegment(segment.value));\n      continue;\n    }\n\n    const value = params[segment.name];\n    const values = Array.isArray(value) ? value : value == null ? [] : [value];\n\n    if (values.length === 0) {\n      if (segment.optional) continue;\n      throw new Error(`Missing route param \"${segment.name}\" for ${pattern}.`);\n    }\n\n    if (!segment.catchAll && values.length > 1) {\n      throw new Error(`Route param \"${segment.name}\" for ${pattern} expects a single value.`);\n    }\n\n    const encodedValues = values.map((item) => {\n      const value = String(item);\n      if (!value) {\n        throw new Error(\n          `Route param \"${segment.name}\" for ${pattern} cannot contain an empty path segment.`,\n        );\n      }\n      return encodePathSegment(value);\n    });\n    parts.push(...encodedValues);\n  }\n\n  let pathname = parts.length ? `/${parts.join(\"/\")}` : \"/\";\n\n  if (options.trailingSlash && pathname !== \"/\") {\n    pathname = `${pathname}/`;\n  }\n\n  return appendQueryAndHash(pathname, options);\n}\n\nexport function isFarmRouteActive(\n  pattern: string,\n  pathname: string,\n  options: FarmRouterActiveOptions = {},\n): boolean {\n  const normalizedPathname = normalizePathname(pathname);\n  if (matchFarmRoute(pattern, normalizedPathname)) return true;\n  if (options.exact !== false) return false;\n\n  const segments = parseRoutePattern(pattern);\n  if (segments.length === 0) return normalizedPathname === \"/\";\n  return matchSegments(segments, normalizedPathname, true) !== null;\n}\n\nfunction normalizeRouteInput<TMeta>(\n  input: FarmRouterRouteInput<TMeta>,\n  index: number,\n): NormalizedRouterRoute<TMeta> {\n  const route = typeof input === \"string\" ? { path: input } : input;\n  const path = normalizeRoutePattern(route.path);\n  const segments = parseRoutePattern(path);\n\n  return {\n    route: {\n      ...route,\n      path,\n    },\n    segments,\n    specificity: segments.map(getRouterSegmentSpecificity),\n    index,\n  };\n}\n\nfunction parseRoutePattern(pattern: string): RouterSegment[] {\n  assertTerminalCatchAll(pattern, \"router\");\n  assertUniqueRouteParameters(pattern, \"router\");\n  return splitRoutePattern(pattern)\n    .filter((part) => !isRouteGroup(part))\n    .map((part) => {\n      const optionalCatchAll = part.match(/^\\[\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]\\]$/);\n      if (optionalCatchAll) {\n        return {\n          type: \"dynamic\",\n          name: optionalCatchAll[1],\n          catchAll: true,\n          optional: true,\n        };\n      }\n\n      const catchAll = part.match(/^\\[\\.\\.\\.([A-Za-z0-9_$-]+)\\]$/);\n      if (catchAll) {\n        return {\n          type: \"dynamic\",\n          name: catchAll[1],\n          catchAll: true,\n          optional: false,\n        };\n      }\n\n      const dynamic = part.match(/^\\[([A-Za-z0-9_$-]+)\\]$/) || part.match(/^:([A-Za-z0-9_$-]+)$/);\n      if (dynamic) {\n        return {\n          type: \"dynamic\",\n          name: dynamic[1],\n          catchAll: false,\n          optional: false,\n        };\n      }\n\n      const star = part.match(/^\\*([A-Za-z0-9_$-]+)(\\?)?$/);\n      if (star) {\n        return {\n          type: \"dynamic\",\n          name: star[1],\n          catchAll: true,\n          optional: !!star[2],\n        };\n      }\n\n      return {\n        type: \"static\",\n        value: decodePathSegment(part),\n      };\n    });\n}\n\nfunction matchSegments(\n  segments: RouterSegment[],\n  pathname: string,\n  allowTrailingSegments = false,\n): FarmRouterParams | null {\n  const parts = splitPathname(pathname);\n  const params: FarmRouterParams = {};\n\n  if (segments.length === 0) {\n    return parts.length === 0 ? params : null;\n  }\n\n  let pathIndex = 0;\n\n  for (const segment of segments) {\n    if (segment.type === \"static\") {\n      if (decodePathSegment(parts[pathIndex] || \"\") !== segment.value) return null;\n      pathIndex++;\n      continue;\n    }\n\n    if (segment.catchAll) {\n      const remaining = parts.slice(pathIndex).map(decodePathSegment);\n      if (remaining.length === 0 && !segment.optional) return null;\n      params[segment.name] = remaining.join(\"/\");\n      pathIndex = parts.length;\n      continue;\n    }\n\n    const value = parts[pathIndex];\n    if (!value) return null;\n    params[segment.name] = decodePathSegment(value);\n    pathIndex++;\n  }\n\n  return allowTrailingSegments || pathIndex === parts.length ? params : null;\n}\n\nfunction compareRoutes<TMeta>(\n  left: NormalizedRouterRoute<TMeta>,\n  right: NormalizedRouterRoute<TMeta>,\n) {\n  const specificity = compareRouteSpecificity(left.specificity, right.specificity);\n  if (specificity !== 0) return specificity;\n  return left.index - right.index;\n}\n\nfunction getRouterSegmentSpecificity(segment: RouterSegment): RouteSegmentSpecificity {\n  if (segment.type === \"static\") return \"static\";\n  if (!segment.catchAll) return \"dynamic\";\n  return segment.optional ? \"optional-catch-all\" : \"catch-all\";\n}\n\nfunction normalizePathname(value: string) {\n  const raw = value || \"/\";\n  let pathname = raw;\n\n  try {\n    pathname = new URL(raw, \"http://farm.local\").pathname;\n  } catch {\n    pathname = raw.split(/[?#]/, 1)[0] || \"/\";\n  }\n\n  pathname = pathname.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\");\n  if (!pathname.startsWith(\"/\")) pathname = `/${pathname}`;\n  if (pathname.length > 1) pathname = pathname.replace(/\\/+$/, \"\");\n  return pathname || \"/\";\n}\n\nfunction splitPathname(pathname: string) {\n  return normalizePathname(pathname).split(\"/\").filter(Boolean);\n}\n\nfunction normalizeRoutePattern(value: string) {\n  let pathname = (value || \"/\").replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\");\n  if (!pathname.startsWith(\"/\")) pathname = `/${pathname}`;\n  if (pathname.length > 1) pathname = pathname.replace(/\\/+$/, \"\");\n  return pathname || \"/\";\n}\n\nfunction splitRoutePattern(pattern: string) {\n  return normalizeRoutePattern(pattern).split(\"/\").filter(Boolean);\n}\n\nfunction isRouteGroup(part: string) {\n  return part.startsWith(\"(\") && part.endsWith(\")\");\n}\n\nfunction decodePathSegment(value: string) {\n  try {\n    return decodeURIComponent(value);\n  } catch {\n    return value;\n  }\n}\n\nfunction encodePathSegment(value: string) {\n  return encodeURIComponent(value);\n}\n\nfunction appendQueryAndHash(pathname: string, options: FarmRouterBuildOptions) {\n  const search = createSearchParams(options.query);\n  const hash = options.hash ? `#${options.hash.replace(/^#/, \"\")}` : \"\";\n  const query = search.toString();\n  return `${pathname}${query ? `?${query}` : \"\"}${hash}`;\n}\n\nfunction createSearchParams(query: FarmRouterBuildOptions[\"query\"]) {\n  if (query instanceof URLSearchParams) return query;\n\n  const search = new URLSearchParams();\n  if (!query) return search;\n\n  for (const [key, value] of Object.entries(query)) {\n    const values = Array.isArray(value) ? value : [value];\n    for (const item of values) {\n      if (item == null) continue;\n      search.append(key, String(item));\n    }\n  }\n\n  return search;\n}\n","export const FARM_DEFERRED_CONTENT_TYPE = \"application/x-farm-deferred+json\";\nexport const FARM_DEFERRED_ERROR_CODE = \"FARM_DEFERRED_DATA_ERROR\";\nexport const FARM_DEFERRED_BRAND: unique symbol = Symbol.for(\n  \"farm.deferred\",\n) as typeof FARM_DEFERRED_BRAND;\n\nconst FARM_DEFERRED_MARKER = \"$farmDeferred\";\n\ntype DeferredState<T = unknown> =\n  | { status: \"pending\" }\n  | { status: \"fulfilled\"; value: T }\n  | { status: \"rejected\"; reason: unknown };\n\nexport interface Deferred<T> extends Promise<T> {\n  readonly [FARM_DEFERRED_BRAND]: true;\n}\n\nexport interface PreparedDeferredData {\n  data: unknown;\n  records: readonly DeferredRecord[];\n}\n\nexport interface DeferredRecord {\n  id: string;\n  promise: Deferred<unknown>;\n}\n\nexport type DeferredSettlement =\n  | { status: \"fulfilled\"; value: unknown }\n  | { status: \"rejected\"; error: { code: typeof FARM_DEFERRED_ERROR_CODE; message: string } };\n\nexport type DeferredSettlements = Record<string, DeferredSettlement>;\n\nexport interface DeferredDataResponseOptions {\n  onError?: (error: unknown, id: string) => void;\n}\n\nexport class DeferredDataError extends Error {\n  readonly name = \"DeferredDataError\";\n  readonly code = FARM_DEFERRED_ERROR_CODE;\n\n  constructor(message = \"Deferred route data failed to load\") {\n    super(message);\n  }\n}\n\nconst deferredStates = new WeakMap<object, DeferredState>();\n\nexport function defer<T>(value: PromiseLike<T>): Deferred<Awaited<T>> {\n  if (isDeferred(value)) {\n    return value as Deferred<Awaited<T>>;\n  }\n\n  const promise = Promise.resolve(value) as Deferred<Awaited<T>>;\n  Object.defineProperty(promise, FARM_DEFERRED_BRAND, {\n    configurable: false,\n    enumerable: false,\n    value: true,\n    writable: false,\n  });\n  deferredStates.set(promise, { status: \"pending\" });\n  promise.then(\n    (resolved) => deferredStates.set(promise, { status: \"fulfilled\", value: resolved }),\n    (reason) => deferredStates.set(promise, { status: \"rejected\", reason }),\n  );\n  return promise;\n}\n\nexport function isDeferred<T = unknown>(value: unknown): value is Deferred<T> {\n  return Boolean(\n    value &&\n    (typeof value === \"object\" || typeof value === \"function\") &&\n    (value as Record<PropertyKey, unknown>)[FARM_DEFERRED_BRAND] === true,\n  );\n}\n\nexport function prepareDeferredData(value: unknown): PreparedDeferredData {\n  const context = createEncodingContext();\n  return {\n    data: encodeDeferredValue(value, context, new WeakSet()),\n    records: context.records,\n  };\n}\n\nexport function snapshotDeferredData(records: readonly DeferredRecord[]): DeferredSettlements {\n  const context = createEncodingContext(records);\n  const settlements: DeferredSettlements = {};\n\n  for (let index = 0; index < context.records.length; index++) {\n    const record = context.records[index]!;\n    const state = readDeferredState(record.promise);\n\n    if (state.status === \"fulfilled\") {\n      try {\n        settlements[record.id] = {\n          status: \"fulfilled\",\n          value: encodeDeferredValue(state.value, context, new WeakSet()),\n        };\n      } catch {\n        settlements[record.id] = createRejectedSettlement();\n      }\n    } else {\n      settlements[record.id] = createRejectedSettlement();\n    }\n  }\n\n  return settlements;\n}\n\nexport function reviveDeferredData<T>(value: T, settlements: DeferredSettlements): T {\n  return reviveDeferredValue(value, new Map(), settlements) as T;\n}\n\nexport function createDeferredDataResponse(\n  value: unknown,\n  init: ResponseInit = {},\n  options: DeferredDataResponseOptions = {},\n): Response {\n  const context = createEncodingContext();\n  const data = encodeDeferredValue(value, context, new WeakSet());\n  const headers = new Headers(init.headers);\n\n  if (context.records.length === 0) {\n    headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n    return new Response(JSON.stringify(data), { ...init, headers });\n  }\n\n  headers.set(\"Content-Type\", `${FARM_DEFERRED_CONTENT_TYPE}; charset=utf-8`);\n  headers.set(\"Cache-Control\", headers.get(\"Cache-Control\") || \"private, max-age=0\");\n  const initialLine = encodeDeferredMessage({ type: \"data\", data });\n  const encoder = new TextEncoder();\n  let cancelled = false;\n\n  const stream = new ReadableStream<Uint8Array>({\n    start(controller) {\n      controller.enqueue(encoder.encode(initialLine));\n      let pending = context.records.length;\n\n      const finishRecord = () => {\n        pending--;\n        if (!cancelled && pending === 0) controller.close();\n      };\n\n      const schedule = (record: DeferredRecord) => {\n        record.promise\n          .then(\n            (resolved) => {\n              if (cancelled) return;\n              try {\n                const previousLength = context.records.length;\n                const encoded = encodeDeferredValue(resolved, context, new WeakSet());\n                const nestedRecords = context.records.slice(previousLength);\n                pending += nestedRecords.length;\n                controller.enqueue(\n                  encoder.encode(\n                    encodeDeferredMessage({ type: \"resolve\", id: record.id, data: encoded }),\n                  ),\n                );\n                for (const nestedRecord of nestedRecords) schedule(nestedRecord);\n              } catch (error) {\n                reportDeferredError(options, error, record.id);\n                controller.enqueue(\n                  encoder.encode(\n                    encodeDeferredMessage({\n                      type: \"reject\",\n                      id: record.id,\n                      error: createDeferredPublicError(),\n                    }),\n                  ),\n                );\n              }\n            },\n            (error) => {\n              if (cancelled) return;\n              reportDeferredError(options, error, record.id);\n              controller.enqueue(\n                encoder.encode(\n                  encodeDeferredMessage({\n                    type: \"reject\",\n                    id: record.id,\n                    error: createDeferredPublicError(),\n                  }),\n                ),\n              );\n            },\n          )\n          .finally(finishRecord);\n      };\n\n      const initialRecords = context.records.slice();\n      for (const record of initialRecords) schedule(record);\n    },\n    cancel() {\n      cancelled = true;\n    },\n  });\n\n  return new Response(stream, { ...init, headers });\n}\n\nexport async function readDeferredDataResponse<T>(response: Response): Promise<T> {\n  const contentType = response.headers.get(\"Content-Type\") || \"\";\n  if (!contentType.toLowerCase().startsWith(FARM_DEFERRED_CONTENT_TYPE)) {\n    return (await response.json()) as T;\n  }\n  if (!response.body) {\n    throw new DeferredDataError(\"Deferred route data response has no body\");\n  }\n\n  const reader = response.body.getReader();\n  const decoder = new TextDecoder();\n  const controllers = new Map<string, ControlledDeferred>();\n  let buffer = \"\";\n  let complete = false;\n\n  const readLine = async (): Promise<string | undefined> => {\n    while (true) {\n      const newline = buffer.indexOf(\"\\n\");\n      if (newline >= 0) {\n        const line = buffer.slice(0, newline);\n        buffer = buffer.slice(newline + 1);\n        return line;\n      }\n      if (complete) {\n        if (!buffer) return undefined;\n        const line = buffer;\n        buffer = \"\";\n        return line;\n      }\n\n      const chunk = await reader.read();\n      complete = chunk.done;\n      if (chunk.value) buffer += decoder.decode(chunk.value, { stream: !chunk.done });\n      if (chunk.done) buffer += decoder.decode();\n    }\n  };\n\n  const firstLine = await readLine();\n  if (!firstLine) {\n    reader.releaseLock();\n    throw new DeferredDataError(\"Deferred route data response is empty\");\n  }\n\n  const initial = parseDeferredMessage(firstLine);\n  if (initial.type !== \"data\") {\n    reader.releaseLock();\n    throw new DeferredDataError(\"Deferred route data response is invalid\");\n  }\n  const data = reviveDeferredValue(initial.data, controllers) as T;\n\n  void (async () => {\n    try {\n      for (let line = await readLine(); line !== undefined; line = await readLine()) {\n        if (!line) continue;\n        const message = parseDeferredMessage(line);\n        if (message.type === \"resolve\") {\n          const controller = getControlledDeferred(message.id, controllers);\n          controller.resolve(reviveDeferredValue(message.data, controllers));\n        } else if (message.type === \"reject\") {\n          getControlledDeferred(message.id, controllers).reject(\n            new DeferredDataError(message.error?.message),\n          );\n        }\n      }\n      rejectPendingDeferred(controllers, \"Deferred route data stream ended before completion\");\n    } catch {\n      rejectPendingDeferred(controllers, \"Deferred route data stream could not be read\");\n    } finally {\n      reader.releaseLock();\n    }\n  })();\n\n  return data;\n}\n\ninterface EncodingContext {\n  records: DeferredRecord[];\n  ids: Map<Deferred<unknown>, string>;\n  nextId: number;\n}\n\ninterface ControlledDeferred {\n  promise: Promise<unknown> & {\n    status?: \"pending\" | \"fulfilled\" | \"rejected\";\n    value?: unknown;\n    reason?: unknown;\n  };\n  resolve(value: unknown): void;\n  reject(error: unknown): void;\n}\n\nfunction createEncodingContext(records: readonly DeferredRecord[] = []): EncodingContext {\n  return {\n    records: [...records],\n    ids: new Map(records.map((record) => [record.promise, record.id])),\n    nextId: records.reduce((highest, record) => {\n      const value = Number(record.id.replace(/^d/, \"\"));\n      return Number.isFinite(value) ? Math.max(highest, value + 1) : highest;\n    }, records.length),\n  };\n}\n\nfunction encodeDeferredValue(\n  value: unknown,\n  context: EncodingContext,\n  ancestors: WeakSet<object>,\n): unknown {\n  if (isDeferred(value)) {\n    let id = context.ids.get(value);\n    if (!id) {\n      id = `d${context.nextId++}`;\n      context.ids.set(value, id);\n      context.records.push({ id, promise: value as Deferred<unknown> });\n    }\n    return { [FARM_DEFERRED_MARKER]: id };\n  }\n  if (!value || typeof value !== \"object\") return value;\n  if (Array.isArray(value)) {\n    assertNotCircular(value, ancestors);\n    const output = value.map((item) => encodeDeferredValue(item, context, ancestors));\n    ancestors.delete(value);\n    return output;\n  }\n\n  const prototype = Object.getPrototypeOf(value);\n  if (prototype !== Object.prototype && prototype !== null) return value;\n\n  assertNotCircular(value, ancestors);\n  const output: Record<string, unknown> = {};\n  for (const [key, item] of Object.entries(value)) {\n    defineDataProperty(output, key, encodeDeferredValue(item, context, ancestors));\n  }\n  ancestors.delete(value);\n  // User data that happens to have the marker shape must not be revived as a\n  // deferred reference. Real ids never start with \"!\", so prefix-escape the\n  // value; revive strips one \"!\" back off.\n  if (isDeferredMarker(output)) {\n    return { [FARM_DEFERRED_MARKER]: `!${output[FARM_DEFERRED_MARKER]}` };\n  }\n  return output;\n}\n\nfunction reviveDeferredValue(\n  value: unknown,\n  controllers: Map<string, ControlledDeferred>,\n  settlements?: DeferredSettlements,\n  applyingSettlements = new Set<string>(),\n): unknown {\n  if (isDeferredMarker(value)) {\n    const id = value[FARM_DEFERRED_MARKER];\n    // Escaped user data, not a deferred reference — restore the original.\n    if (id.startsWith(\"!\")) {\n      return { [FARM_DEFERRED_MARKER]: id.slice(1) };\n    }\n    const controller = getControlledDeferred(id, controllers);\n    const settlement = settlements?.[id];\n    if (settlement && controller.promise.status === \"pending\") {\n      if (applyingSettlements.has(id)) return controller.promise;\n      applyingSettlements.add(id);\n      if (settlement.status === \"fulfilled\") {\n        controller.resolve(\n          reviveDeferredValue(settlement.value, controllers, settlements, applyingSettlements),\n        );\n      } else {\n        controller.reject(new DeferredDataError(settlement.error.message));\n      }\n      applyingSettlements.delete(id);\n    } else if (settlements && controller.promise.status === \"pending\") {\n      controller.reject(new DeferredDataError(\"Deferred route data was not resolved\"));\n    }\n    return controller.promise;\n  }\n  if (Array.isArray(value)) {\n    return value.map((item) =>\n      reviveDeferredValue(item, controllers, settlements, applyingSettlements),\n    );\n  }\n  if (!value || typeof value !== \"object\") return value;\n\n  const prototype = Object.getPrototypeOf(value);\n  if (prototype !== Object.prototype && prototype !== null) return value;\n  const output: Record<string, unknown> = {};\n  for (const [key, item] of Object.entries(value)) {\n    defineDataProperty(\n      output,\n      key,\n      reviveDeferredValue(item, controllers, settlements, applyingSettlements),\n    );\n  }\n  return output;\n}\n\n// Assign an own key preserving its data. A plain `output[key] = value` runs the\n// `Object.prototype.__proto__` setter when `key` is the string \"__proto__\" (the\n// shape JSON.parse of external input produces), which silently drops the entry\n// and mutates the object's prototype instead of storing the value. Defining the\n// property sidesteps the accessor for that one key; other keys keep the fast path.\nfunction defineDataProperty(output: Record<string, unknown>, key: string, value: unknown): void {\n  if (key === \"__proto__\") {\n    Object.defineProperty(output, key, {\n      value,\n      enumerable: true,\n      writable: true,\n      configurable: true,\n    });\n  } else {\n    output[key] = value;\n  }\n}\n\nfunction getControlledDeferred(\n  id: string,\n  controllers: Map<string, ControlledDeferred>,\n): ControlledDeferred {\n  const existing = controllers.get(id);\n  if (existing) return existing;\n\n  let nativeResolve!: (value: unknown) => void;\n  let nativeReject!: (error: unknown) => void;\n  const promise = new Promise<unknown>((resolve, reject) => {\n    nativeResolve = resolve;\n    nativeReject = reject;\n  }) as ControlledDeferred[\"promise\"];\n  promise.status = \"pending\";\n  promise.catch(() => undefined);\n\n  const controlled: ControlledDeferred = {\n    promise,\n    resolve(value) {\n      if (promise.status !== \"pending\") return;\n      promise.status = \"fulfilled\";\n      promise.value = value;\n      nativeResolve(value);\n    },\n    reject(error) {\n      if (promise.status !== \"pending\") return;\n      promise.status = \"rejected\";\n      promise.reason = error;\n      nativeReject(error);\n    },\n  };\n  controllers.set(id, controlled);\n  return controlled;\n}\n\nfunction readDeferredState(promise: Deferred<unknown>): DeferredState {\n  const tracked = deferredStates.get(promise);\n  if (tracked && tracked.status !== \"pending\") return tracked;\n\n  const reactState = promise as Deferred<unknown> & {\n    status?: string;\n    value?: unknown;\n    reason?: unknown;\n  };\n  if (reactState.status === \"fulfilled\") {\n    return { status: \"fulfilled\", value: reactState.value };\n  }\n  if (reactState.status === \"rejected\") {\n    return { status: \"rejected\", reason: reactState.reason };\n  }\n  return tracked || { status: \"pending\" };\n}\n\nfunction isDeferredMarker(value: unknown): value is { [FARM_DEFERRED_MARKER]: string } {\n  return Boolean(\n    value &&\n    typeof value === \"object\" &&\n    Object.keys(value).length === 1 &&\n    typeof (value as Record<string, unknown>)[FARM_DEFERRED_MARKER] === \"string\",\n  );\n}\n\nfunction assertNotCircular(value: object, ancestors: WeakSet<object>): void {\n  if (ancestors.has(value)) {\n    throw new TypeError(\"Deferred route data must be JSON-serializable and cannot be circular\");\n  }\n  ancestors.add(value);\n}\n\nfunction createDeferredPublicError() {\n  return {\n    code: FARM_DEFERRED_ERROR_CODE,\n    message: \"Deferred route data failed to load\",\n  } as const;\n}\n\nfunction createRejectedSettlement(): DeferredSettlement {\n  return { status: \"rejected\", error: createDeferredPublicError() };\n}\n\nfunction reportDeferredError(\n  options: DeferredDataResponseOptions,\n  error: unknown,\n  id: string,\n): void {\n  try {\n    options.onError?.(error, id);\n  } catch {\n    // Error reporting must not break the response stream.\n  }\n}\n\nfunction encodeDeferredMessage(message: Record<string, unknown>): string {\n  return `${JSON.stringify(message)}\\n`;\n}\n\nfunction parseDeferredMessage(line: string): any {\n  try {\n    return JSON.parse(line);\n  } catch {\n    throw new DeferredDataError(\"Deferred route data response contains invalid JSON\");\n  }\n}\n\nfunction rejectPendingDeferred(\n  controllers: Map<string, ControlledDeferred>,\n  message: string,\n): void {\n  for (const controller of controllers.values()) {\n    if (controller.promise.status === \"pending\") {\n      controller.reject(new DeferredDataError(message));\n    }\n  }\n}\n","import { getInstalledFarmSPARouter, type SPARouter } from \"./spa-router\";\n\n/** Fired after programmatic history writes that must not start a navigation. */\nexport const FARM_HISTORY_CHANGE_EVENT = \"farm:historychange\";\n\nexport type FarmHistoryChangeKind = \"url-search\" | \"page-state\";\n\nexport interface FarmHistoryChangeDetail {\n  kind: FarmHistoryChangeKind;\n}\n\n/** Write shallow URL history through the installed SPA router when available. */\nexport function writeFarmURLSearchHistory(action: \"push\" | \"replace\", href: string): boolean {\n  const router = getInstalledFarmSPARouter();\n  if (!router) return false;\n  const writeURLSearch = (router as { writeURLSearch?: SPARouter[\"writeURLSearch\"] })\n    .writeURLSearch;\n  if (typeof writeURLSearch !== \"function\") return false;\n  if (window.history.state !== null && typeof window.history.state !== \"object\") return false;\n  writeURLSearch.call(router, action, href);\n  return true;\n}\n\nfunction dispatchHistoryChange(kind: FarmHistoryChangeKind): void {\n  window.dispatchEvent(\n    new CustomEvent<FarmHistoryChangeDetail>(FARM_HISTORY_CHANGE_EVENT, {\n      detail: { kind },\n    }),\n  );\n}\n\n/**\n * Notify history observers after pushState/replaceState.\n *\n * Farm's SPA router treats `popstate` as real back/forward navigation, so a\n * dedicated event is used instead. `url-search` keeps the nuqs-style synthetic\n * `popstate` when no Farm router is installed, so standalone `useQueryState`\n * consumers still resync; `page-state` is Farm-internal and never falls back.\n */\nexport function notifyHistoryChange(kind: FarmHistoryChangeKind): void {\n  if (typeof window === \"undefined\") return;\n\n  setTimeout(() => {\n    if (kind === \"url-search\" && !getInstalledFarmSPARouter()) {\n      window.dispatchEvent(new PopStateEvent(\"popstate\"));\n      return;\n    }\n\n    dispatchHistoryChange(kind);\n  }, 0);\n}\n\n/** Notify observers after a Farm router commit without simulating traversal. */\nexport function notifyRouterHistoryChange(): void {\n  if (typeof window === \"undefined\") return;\n  setTimeout(() => dispatchHistoryChange(\"url-search\"), 0);\n}\n\nexport function subscribeHistoryChange(listener: () => void): () => void {\n  if (typeof window === \"undefined\") return () => {};\n\n  window.addEventListener(\"popstate\", listener);\n  window.addEventListener(FARM_HISTORY_CHANGE_EVENT, listener);\n\n  return () => {\n    window.removeEventListener(\"popstate\", listener);\n    window.removeEventListener(FARM_HISTORY_CHANGE_EVENT, listener);\n  };\n}\n","export const FARM_DEPLOYMENT_ID_HEADER = \"x-farm-deployment-id\";\nexport const FARM_DEPLOYMENT_MISMATCH_HEADER = \"x-farm-deployment-mismatch\";\nexport const FARM_DEPLOYMENT_COOKIE = \"__farm_deployment\";\nexport const FARM_DEPLOYMENT_MISMATCH_CODE = \"FARM_DEPLOYMENT_MISMATCH\";\nexport const FARM_DEPLOYMENT_MISMATCH_STATUS = 409;\n\nexport type FarmPresetRuntime = \"node\" | \"edge\" | \"unknown\";\n\nexport function getFarmPresetRuntime(preset: string): FarmPresetRuntime {\n  if (\n    preset === \"cloudflare\" ||\n    preset === \"cloudflare-pages\" ||\n    preset === \"cloudflare-module\" ||\n    preset === \"netlify-edge\" ||\n    preset === \"vercel-edge\" ||\n    preset === \"deno\"\n  ) {\n    return \"edge\";\n  }\n\n  if (\n    preset === \"node-server\" ||\n    preset === \"vercel\" ||\n    preset === \"netlify\" ||\n    preset === \"aws-lambda\" ||\n    preset === \"azure\" ||\n    preset === \"firebase\" ||\n    preset === \"bun\" ||\n    preset === \"self-host\" ||\n    preset === \"farm\"\n  ) {\n    return \"node\";\n  }\n\n  return \"unknown\";\n}\n\nexport interface FarmDeploymentMismatch {\n  clientDeploymentId: string;\n  serverDeploymentId: string;\n}\n\nexport interface FarmDeploymentResponseOptions {\n  setCookie?: boolean;\n  cookiePath?: string;\n  secureCookie?: boolean;\n}\n\nexport class FarmDeploymentMismatchError extends Error {\n  readonly name = \"FarmDeploymentMismatchError\";\n  readonly code = FARM_DEPLOYMENT_MISMATCH_CODE;\n  readonly retryable = false;\n\n  constructor(\n    readonly clientDeploymentId: string,\n    readonly serverDeploymentId: string,\n  ) {\n    super(\"The application was updated while this page was open. Refresh before trying again.\");\n  }\n}\n\nexport function normalizeFarmDeploymentId(value: unknown): string {\n  if (typeof value !== \"string\" || value.trim() === \"\") {\n    throw new TypeError(\"Farm deploymentId must be a non-empty string\");\n  }\n\n  const normalized = value.trim();\n  if (normalized.length > 200 || /[\\u0000-\\u001f\\u007f]/.test(normalized)) {\n    throw new TypeError(\"Farm deploymentId must be at most 200 characters without control bytes\");\n  }\n\n  return normalized;\n}\n\nexport function createFarmDeploymentRequestHeaders(\n  deploymentId: string | undefined,\n  init?: HeadersInit,\n): Headers {\n  const headers = new Headers(init);\n  if (deploymentId) {\n    headers.set(FARM_DEPLOYMENT_ID_HEADER, deploymentId);\n  }\n  return headers;\n}\n\nexport function getFarmRequestDeploymentId(\n  request: Pick<Request, \"headers\" | \"method\">,\n): string | undefined {\n  const headerValue = request.headers.get(FARM_DEPLOYMENT_ID_HEADER)?.trim();\n  if (headerValue) return headerValue;\n\n  if (isSafeRequestMethod(request.method)) return undefined;\n  return readCookie(request.headers.get(\"cookie\"), FARM_DEPLOYMENT_COOKIE);\n}\n\nexport function getFarmDeploymentMismatch(\n  request: Pick<Request, \"headers\" | \"method\">,\n  serverDeploymentId: string | undefined,\n): FarmDeploymentMismatch | null {\n  if (!serverDeploymentId) return null;\n\n  const clientDeploymentId = getFarmRequestDeploymentId(request);\n  if (!clientDeploymentId || clientDeploymentId === serverDeploymentId) return null;\n\n  return { clientDeploymentId, serverDeploymentId };\n}\n\nexport function createFarmDeploymentMismatchResponse(mismatch: FarmDeploymentMismatch): Response {\n  return new Response(\n    JSON.stringify({\n      error: FARM_DEPLOYMENT_MISMATCH_CODE,\n      message: \"The application deployment changed. Refresh before retrying this request.\",\n    }),\n    {\n      status: FARM_DEPLOYMENT_MISMATCH_STATUS,\n      headers: {\n        \"Cache-Control\": \"no-store\",\n        \"Content-Type\": \"application/json; charset=utf-8\",\n        [FARM_DEPLOYMENT_ID_HEADER]: mismatch.serverDeploymentId,\n        [FARM_DEPLOYMENT_MISMATCH_HEADER]: \"1\",\n      },\n    },\n  );\n}\n\nexport function withFarmDeploymentResponse(\n  response: Response,\n  deploymentId: string | undefined,\n  options: FarmDeploymentResponseOptions = {},\n): Response {\n  if (!deploymentId) return response;\n\n  const headers = new Headers(response.headers);\n  headers.set(FARM_DEPLOYMENT_ID_HEADER, deploymentId);\n  if (options.setCookie) {\n    headers.append(\n      \"Set-Cookie\",\n      createFarmDeploymentCookie(\n        deploymentId,\n        options.cookiePath ?? \"/\",\n        options.secureCookie ?? false,\n      ),\n    );\n  }\n\n  return new Response(response.body, {\n    status: response.status,\n    statusText: response.statusText,\n    headers,\n  });\n}\n\nexport function getFarmResponseDeploymentId(\n  response: Pick<Response, \"headers\">,\n): string | undefined {\n  return response.headers.get(FARM_DEPLOYMENT_ID_HEADER)?.trim() || undefined;\n}\n\nexport function isFarmDeploymentMismatchResponse(\n  response: Pick<Response, \"headers\" | \"status\">,\n  clientDeploymentId: string | undefined,\n): boolean {\n  const serverDeploymentId = getFarmResponseDeploymentId(response);\n  if (clientDeploymentId && serverDeploymentId && clientDeploymentId !== serverDeploymentId) {\n    return true;\n  }\n\n  return (\n    response.status === FARM_DEPLOYMENT_MISMATCH_STATUS &&\n    response.headers.get(FARM_DEPLOYMENT_MISMATCH_HEADER) === \"1\"\n  );\n}\n\nexport function createFarmDeploymentMismatchError(\n  response: Pick<Response, \"headers\">,\n  clientDeploymentId: string,\n): FarmDeploymentMismatchError {\n  return new FarmDeploymentMismatchError(\n    clientDeploymentId,\n    getFarmResponseDeploymentId(response) || \"unknown\",\n  );\n}\n\nexport function createFarmDeploymentCookie(\n  deploymentId: string,\n  path = \"/\",\n  secure = false,\n): string {\n  const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n  return [\n    `${FARM_DEPLOYMENT_COOKIE}=${encodeURIComponent(deploymentId)}`,\n    `Path=${normalizedPath}`,\n    \"HttpOnly\",\n    \"SameSite=Lax\",\n    secure ? \"Secure\" : \"\",\n  ]\n    .filter(Boolean)\n    .join(\"; \");\n}\n\nfunction readCookie(cookieHeader: string | null, name: string): string | undefined {\n  if (!cookieHeader) return undefined;\n\n  for (const part of cookieHeader.split(\";\")) {\n    const separator = part.indexOf(\"=\");\n    if (separator === -1 || part.slice(0, separator).trim() !== name) continue;\n\n    const value = part.slice(separator + 1).trim();\n    try {\n      return decodeURIComponent(value);\n    } catch {\n      return value;\n    }\n  }\n\n  return undefined;\n}\n\nfunction isSafeRequestMethod(method: string): boolean {\n  return [\"GET\", \"HEAD\", \"OPTIONS\", \"QUERY\"].includes(method.toUpperCase());\n}\n","export function getHashTargetElement(hash: string): Element | null {\n  // A fragment is not a CSS selector. Match by decoded id, raw id, then the\n  // legacy anchor name so SPA navigation follows native browser semantics.\n  const fragment = hash.startsWith(\"#\") ? hash.slice(1) : hash;\n  if (!fragment) return null;\n\n  let decoded = fragment;\n  try {\n    decoded = decodeURIComponent(fragment);\n  } catch {\n    // Keep the raw fragment when its percent-encoding is malformed.\n  }\n\n  return (\n    document.getElementById(decoded) ||\n    document.getElementById(fragment) ||\n    document.getElementsByName(decoded)[0] ||\n    null\n  );\n}\n","export function isFarmExternalNavigationURL(url: URL, currentOrigin: string): boolean {\n  return (url.protocol !== \"http:\" && url.protocol !== \"https:\") || url.origin !== currentOrigin;\n}\n\n/**\n * Resolve a navigation target the way the platform does.\n *\n * Relative references resolve against the *document's* URL, not the origin.\n * Basing on the origin turns `?tab=2` into `/?tab=2` and `details` into\n * `/details`, discarding the directory the user is actually on, so every\n * navigation entry point has to resolve through here.\n *\n * Absolute paths and absolute URLs are unaffected by the choice of base.\n */\nexport function resolveFarmNavigationURL(href: string, documentUrl: string): URL {\n  return new URL(href, documentUrl);\n}\n","/**\n * Agent-readiness configuration: opt-in primitives that make a Farm site easier\n * for AI agents and crawlers to discover, resolve, and use. Off by default so\n * sites that do not want agent exposure (internal tools, private dashboards) are\n * unaffected.\n */\n\n/** schema.org JSON-LD emitted in the document head to identify the site. */\nexport interface FarmAgentJsonLd {\n  /**\n   * schema.org `@type`. Common values: `\"Organization\"` for a company or\n   * project, `\"SoftwareApplication\"` for a product, `\"WebSite\"`, `\"Person\"`.\n   *\n   * @default \"Organization\"\n   */\n  type?: string;\n  /** Entity name. Defaults to the site's Open Graph site name or page title. */\n  name?: string;\n  /** Canonical URL for the entity. Defaults to the configured `metadataBase`. */\n  url?: string;\n  /** Short description. Defaults to the page/site metadata description. */\n  description?: string;\n  /** Logo URL. */\n  logo?: string;\n  /** URLs that also represent this entity (social profiles, repos) — schema.org `sameAs`. */\n  sameAs?: string[];\n  /** Additional schema.org properties merged into the emitted object. */\n  properties?: Record<string, unknown>;\n}\n\nexport interface FarmAgentUserConfig {\n  /**\n   * Emit schema.org JSON-LD in the document head so agents and crawlers can\n   * resolve the site's identity. `true` emits an `Organization` built from the\n   * site's metadata; an object customizes the type and fields.\n   *\n   * @default false\n   */\n  jsonLd?: boolean | FarmAgentJsonLd;\n}\n\nexport interface ResolvedFarmAgentConfig {\n  jsonLd: FarmAgentJsonLd | false;\n}\n\nexport function resolveFarmAgentConfig(\n  input: FarmAgentUserConfig | undefined,\n): ResolvedFarmAgentConfig {\n  const jsonLd = input?.jsonLd;\n  if (!jsonLd) return { jsonLd: false };\n  return { jsonLd: jsonLd === true ? {} : jsonLd };\n}\n\nexport interface FarmAgentJsonLdContext {\n  metadataBase?: string;\n  siteName?: string;\n  title?: string;\n  description?: string;\n}\n\nfunction pruneUndefined(object: Record<string, unknown>): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(object)) {\n    if (value !== undefined && value !== null && value !== \"\") result[key] = value;\n  }\n  return result;\n}\n\n/**\n * Serialize a JSON-LD object for inline `<script>` embedding, escaping `<` so a\n * value containing `</script>` cannot break out of the tag.\n */\nfunction serializeJsonLd(value: unknown): string {\n  return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\n/**\n * Build a JSON-LD `<script>` tag for the site identity, or an empty string when\n * there is not enough information to emit meaningful structured data.\n */\nexport function renderFarmAgentJsonLd(\n  config: FarmAgentJsonLd,\n  context: FarmAgentJsonLdContext,\n): string {\n  const base = pruneUndefined({\n    name: config.name ?? context.siteName ?? context.title,\n    url: config.url ?? context.metadataBase,\n    description: config.description ?? context.description,\n    logo: config.logo,\n    sameAs: config.sameAs && config.sameAs.length > 0 ? config.sameAs : undefined,\n  });\n\n  const object = {\n    \"@context\": \"https://schema.org\",\n    \"@type\": config.type || \"Organization\",\n    ...base,\n    ...(config.properties || {}),\n  };\n\n  // Nothing beyond @context/@type and no custom properties: not worth emitting.\n  if (Object.keys(object).length <= 2 && !config.properties) {\n    return \"\";\n  }\n\n  return `<script type=\"application/ld+json\">${serializeJsonLd(object)}</script>`;\n}\n","import type { Metadata } from \"./types\";\nimport { renderFarmAgentJsonLd, type FarmAgentJsonLd } from \"./agent-config\";\n\nexport type MetadataImageKind = \"opengraph\" | \"twitter\";\n\nexport interface FarmMetadataImageReference {\n  kind: MetadataImageKind;\n  href: string;\n  alt?: string;\n  width?: number;\n  height?: number;\n  contentType?: string;\n}\n\nexport interface RenderedMetadataHead {\n  title: string;\n  tags: string;\n  hasFavicon: boolean;\n  /** False when the title is the framework fallback rather than configured. */\n  hasExplicitTitle: boolean;\n}\n\ntype MetadataRecord = Metadata & Record<string, any>;\n\nexport function mergeMetadata(\n  base: MetadataRecord | undefined,\n  next: MetadataRecord | undefined,\n): MetadataRecord {\n  if (!base) return next ? { ...next } : {};\n  if (!next) return { ...base };\n\n  return {\n    ...base,\n    ...next,\n    title: mergeMetadataTitle(base.title, next.title),\n    openGraph: mergeNestedMetadata(base.openGraph, next.openGraph),\n    twitter: mergeNestedMetadata(base.twitter, next.twitter),\n    alternates: mergeNestedMetadata((base as any).alternates, (next as any).alternates),\n    icons: mergeNestedMetadata((base as any).icons, (next as any).icons),\n  };\n}\n\nfunction mergeMetadataTitle(base: Metadata[\"title\"], next: Metadata[\"title\"]): Metadata[\"title\"] {\n  if (next === undefined) return base;\n\n  const parentTemplate = isRecord(base) ? normalizeContent(base.template) : undefined;\n  if (typeof next === \"string\") {\n    return parentTemplate ? applyTitleTemplate(parentTemplate, next) : next;\n  }\n\n  if (!isRecord(next)) return next;\n\n  const defaultTitle = normalizeContent(next.default) ?? resolveMetadataTitle(base);\n  return {\n    ...next,\n    default:\n      defaultTitle && parentTemplate\n        ? applyTitleTemplate(parentTemplate, defaultTitle)\n        : defaultTitle,\n  };\n}\n\nfunction applyTitleTemplate(template: string, title: string): string {\n  return template.split(\"%s\").join(title);\n}\n\nexport function addMetadataImageReference(\n  metadata: MetadataRecord,\n  reference: FarmMetadataImageReference,\n): MetadataRecord {\n  if (reference.kind === \"opengraph\") {\n    const openGraph = { ...metadata.openGraph };\n    if (!hasMetadataImages(openGraph.images) && !hasMetadataImages((openGraph as any).image)) {\n      openGraph.images = [\n        {\n          url: reference.href,\n          width: reference.width,\n          height: reference.height,\n          alt: reference.alt,\n          type: reference.contentType,\n        },\n      ];\n    }\n\n    return {\n      ...metadata,\n      openGraph,\n    };\n  }\n\n  const twitter = { ...metadata.twitter };\n  if (!hasMetadataImages(twitter.images)) {\n    twitter.images = [reference.href];\n    twitter.card = twitter.card || \"summary_large_image\";\n  }\n\n  return {\n    ...metadata,\n    twitter,\n  };\n}\n\nexport interface RenderMetadataHeadOptions {\n  /**\n   * Current request pathname. Used to emit a default `<link rel=\"canonical\">`\n   * when the route does not set one, so agents and crawlers can resolve the\n   * page's identity. Combined with `metadataBase` into an absolute URL when a\n   * base is configured; otherwise emitted as a self-referential path.\n   */\n  pathname?: string;\n  /**\n   * Agent JSON-LD config. When truthy, a schema.org JSON-LD script is emitted in\n   * the head, built from this config and the page/site metadata. `true` uses the\n   * defaults; `false`/omitted (the default) emits nothing.\n   */\n  jsonLd?: FarmAgentJsonLd | boolean;\n}\n\nexport function renderMetadataHead(\n  metadata: MetadataRecord | undefined,\n  options: RenderMetadataHeadOptions = {},\n): RenderedMetadataHead {\n  const resolvedMetadata = metadata || {};\n  const metadataBase = resolveMetadataBase(resolvedMetadata);\n  const explicitTitle = resolveMetadataTitle(resolvedMetadata.title);\n  const title = explicitTitle || \"Farm.js App\";\n  const tags: string[] = [];\n\n  appendMetaName(tags, \"description\", resolvedMetadata.description);\n  appendMetaName(tags, \"keywords\", normalizeKeywords(resolvedMetadata.keywords));\n  appendMetaName(tags, \"author\", (resolvedMetadata as any).author);\n\n  if (Array.isArray(resolvedMetadata.authors)) {\n    for (const author of resolvedMetadata.authors) {\n      appendMetaName(tags, \"author\", author?.name);\n      if (author?.url) {\n        appendLink(tags, \"author\", resolveMetadataUrl(author.url, metadataBase));\n      }\n    }\n  }\n\n  appendMetaName(tags, \"creator\", resolvedMetadata.creator);\n  appendMetaName(tags, \"publisher\", resolvedMetadata.publisher);\n  appendMetaName(tags, \"robots\", normalizeRobots(resolvedMetadata.robots));\n\n  const alternates = (resolvedMetadata as any).alternates;\n  const explicitCanonical = isRecord(alternates) ? alternates.canonical : undefined;\n  // Default the canonical link to the current path when the route does not set\n  // one. This is a self-referential canonical (absolute when `metadataBase` is\n  // configured), which is safe for every page and gives agents/crawlers a\n  // stable identity for the URL.\n  const canonicalHref =\n    explicitCanonical != null\n      ? resolveMetadataUrl(explicitCanonical, metadataBase)\n      : options.pathname\n        ? resolveMetadataUrl(sanitizeSelfCanonicalPathname(options.pathname), metadataBase)\n        : undefined;\n  if (canonicalHref) {\n    appendLink(tags, \"canonical\", canonicalHref);\n  }\n\n  if (isRecord(alternates) && isRecord(alternates.languages)) {\n    for (const [language, href] of Object.entries(alternates.languages)) {\n      appendLink(tags, \"alternate\", resolveMetadataUrl(href, metadataBase), {\n        hreflang: language,\n      });\n    }\n  }\n\n  const hasFavicon = appendIcons(tags, (resolvedMetadata as any).icons, metadataBase);\n\n  if ((resolvedMetadata as any).manifest) {\n    appendLink(\n      tags,\n      \"manifest\",\n      resolveMetadataUrl((resolvedMetadata as any).manifest, metadataBase),\n    );\n  }\n\n  appendOpenGraph(tags, resolvedMetadata.openGraph, metadataBase);\n  appendTwitter(tags, resolvedMetadata.twitter, metadataBase);\n\n  if (options.jsonLd) {\n    const jsonLdConfig = options.jsonLd === true ? {} : options.jsonLd;\n    const jsonLdScript = renderFarmAgentJsonLd(jsonLdConfig, {\n      metadataBase,\n      siteName: isRecord(resolvedMetadata.openGraph)\n        ? normalizeContent(resolvedMetadata.openGraph.siteName)\n        : undefined,\n      title: explicitTitle,\n      description: normalizeContent(resolvedMetadata.description),\n    });\n    if (jsonLdScript) tags.push(jsonLdScript);\n  }\n\n  return {\n    title: escapeText(title),\n    tags: tags.length > 0 ? `\\n  ${tags.join(\"\\n  \")}` : \"\",\n    hasFavicon,\n    hasExplicitTitle: Boolean(explicitTitle),\n  };\n}\n\nfunction mergeNestedMetadata(base: unknown, next: unknown): any {\n  if (isRecord(base) && isRecord(next)) {\n    return {\n      ...base,\n      ...next,\n    };\n  }\n\n  return next ?? base;\n}\n\nfunction appendOpenGraph(tags: string[], openGraph: Metadata[\"openGraph\"], metadataBase?: string) {\n  if (!isRecord(openGraph)) return;\n\n  appendMetaProperty(tags, \"og:title\", openGraph.title);\n  appendMetaProperty(tags, \"og:description\", openGraph.description);\n  appendMetaProperty(tags, \"og:url\", resolveMetadataUrl(openGraph.url, metadataBase));\n  appendMetaProperty(tags, \"og:site_name\", openGraph.siteName);\n  // Default og:type so a route that sets Open Graph data without a type still\n  // emits a valid entity type for agents and social crawlers.\n  appendMetaProperty(tags, \"og:type\", openGraph.type ?? \"website\");\n  appendMetaProperty(tags, \"og:locale\", (openGraph as any).locale);\n\n  const images = normalizeMetadataImages(\n    openGraph.images ?? (openGraph as any).image,\n    metadataBase,\n  );\n  for (const image of images) {\n    appendMetaProperty(tags, \"og:image\", image.url);\n    appendMetaProperty(tags, \"og:image:width\", image.width);\n    appendMetaProperty(tags, \"og:image:height\", image.height);\n    appendMetaProperty(tags, \"og:image:alt\", image.alt);\n    appendMetaProperty(tags, \"og:image:type\", image.type);\n  }\n}\n\nfunction appendTwitter(tags: string[], twitter: Metadata[\"twitter\"], metadataBase?: string) {\n  if (!isRecord(twitter)) return;\n\n  appendMetaName(tags, \"twitter:card\", twitter.card);\n  appendMetaName(tags, \"twitter:site\", twitter.site);\n  appendMetaName(tags, \"twitter:creator\", twitter.creator);\n  appendMetaName(tags, \"twitter:title\", twitter.title);\n  appendMetaName(tags, \"twitter:description\", twitter.description);\n\n  for (const image of normalizeMetadataImages(twitter.images, metadataBase)) {\n    appendMetaName(tags, \"twitter:image\", image.url);\n    appendMetaName(tags, \"twitter:image:alt\", image.alt);\n  }\n}\n\nfunction appendIcons(tags: string[], icons: unknown, metadataBase?: string): boolean {\n  if (!icons) return false;\n\n  if (typeof icons === \"string\") {\n    const initialTagCount = tags.length;\n    appendLink(tags, \"icon\", resolveMetadataUrl(icons, metadataBase));\n    return tags.length > initialTagCount;\n  }\n\n  if (!isRecord(icons)) return false;\n\n  const initialTagCount = tags.length;\n  appendIconList(tags, \"icon\", icons.icon, metadataBase);\n  appendIconList(tags, \"shortcut icon\", icons.shortcut, metadataBase);\n  const hasFavicon = tags.length > initialTagCount;\n  appendIconList(tags, \"apple-touch-icon\", icons.apple, metadataBase);\n  return hasFavicon;\n}\n\nfunction appendIconList(tags: string[], rel: string, value: unknown, metadataBase?: string) {\n  for (const icon of normalizeArray(value)) {\n    if (typeof icon === \"string\") {\n      appendLink(tags, rel, resolveMetadataUrl(icon, metadataBase));\n      continue;\n    }\n\n    if (!isRecord(icon)) continue;\n    appendLink(tags, rel, resolveMetadataUrl(icon.url, metadataBase), {\n      sizes: icon.sizes,\n      type: icon.type,\n    });\n  }\n}\n\nfunction appendMetaName(tags: string[], name: string, content: unknown) {\n  const normalized = normalizeContent(content);\n  if (!normalized) return;\n  tags.push(`<meta name=\"${escapeAttribute(name)}\" content=\"${escapeAttribute(normalized)}\">`);\n}\n\nfunction appendMetaProperty(tags: string[], property: string, content: unknown) {\n  const normalized = normalizeContent(content);\n  if (!normalized) return;\n  tags.push(\n    `<meta property=\"${escapeAttribute(property)}\" content=\"${escapeAttribute(normalized)}\">`,\n  );\n}\n\nfunction appendLink(\n  tags: string[],\n  rel: string,\n  href: unknown,\n  attrs: Record<string, unknown> = {},\n) {\n  const normalizedHref = normalizeContent(href);\n  if (!normalizedHref) return;\n\n  const attrText = Object.entries(attrs)\n    .map(([key, value]) => {\n      const normalized = normalizeContent(value);\n      return normalized ? ` ${key}=\"${escapeAttribute(normalized)}\"` : \"\";\n    })\n    .join(\"\");\n\n  tags.push(\n    `<link rel=\"${escapeAttribute(rel)}\" href=\"${escapeAttribute(normalizedHref)}\"${attrText}>`,\n  );\n}\n\nfunction normalizeMetadataImages(\n  value: unknown,\n  metadataBase?: string,\n): Array<{\n  url: string;\n  width?: number;\n  height?: number;\n  alt?: string;\n  type?: string;\n}> {\n  return normalizeArray(value)\n    .map((item) => {\n      if (typeof item === \"string\") {\n        return { url: resolveMetadataUrl(item, metadataBase) || item };\n      }\n\n      if (!isRecord(item)) return null;\n      const rawUrl = item.url || item.src;\n      const url = resolveMetadataUrl(rawUrl, metadataBase);\n      if (!url) return null;\n\n      return {\n        url,\n        width: normalizeNumber(item.width),\n        height: normalizeNumber(item.height),\n        alt: typeof item.alt === \"string\" ? item.alt : undefined,\n        type: typeof item.type === \"string\" ? item.type : undefined,\n      };\n    })\n    .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\nfunction normalizeArray(value: unknown): unknown[] {\n  if (value == null) return [];\n  return Array.isArray(value) ? value : [value];\n}\n\nfunction hasMetadataImages(value: unknown): boolean {\n  return normalizeMetadataImages(value).length > 0;\n}\n\n/**\n * Resolve a metadata title into displayable text. Exported so client-side\n * navigation resolves the object form the same way SSR does instead of\n * stringifying it into \"[object Object]\".\n */\nexport function resolveMetadataTitle(title: Metadata[\"title\"]): string | undefined {\n  if (typeof title === \"string\") return title;\n  if (isRecord(title)) {\n    return normalizeContent(title.default);\n  }\n  return undefined;\n}\n\nfunction normalizeKeywords(keywords: Metadata[\"keywords\"]): string | undefined {\n  if (Array.isArray(keywords)) return keywords.filter(Boolean).join(\", \");\n  return keywords;\n}\n\nfunction normalizeRobots(robots: Metadata[\"robots\"]): string | undefined {\n  if (typeof robots === \"string\") return robots;\n  if (!isRecord(robots)) return undefined;\n\n  const values: string[] = [];\n  if (typeof robots.index === \"boolean\") values.push(robots.index ? \"index\" : \"noindex\");\n  if (typeof robots.follow === \"boolean\") values.push(robots.follow ? \"follow\" : \"nofollow\");\n  return values.join(\", \") || undefined;\n}\n\nfunction resolveMetadataBase(metadata: MetadataRecord): string | undefined {\n  const base = metadata.metadataBase;\n  if (!base) return undefined;\n  return String(base);\n}\n\n/**\n * Keep the defaulted self-canonical on this origin. The pathname comes straight\n * from the request URL, and forms like `//evil.com` or `/\\evil.com` resolve to a\n * cross-origin URL through `new URL()` (and browsers treat `\\` as `/`), which\n * would advertise an attacker's domain as the page's canonical identity. Any\n * request path introducing an authority is collapsed to a single leading slash\n * so the canonical stays same-origin. Developer-supplied `alternates.canonical`\n * is trusted and does not pass through here.\n */\nfunction sanitizeSelfCanonicalPathname(pathname: string): string {\n  if (typeof pathname !== \"string\" || pathname.length === 0) return \"/\";\n  const collapsed = pathname.replace(/^[/\\\\]+/, \"/\");\n  return collapsed.startsWith(\"/\") ? collapsed : `/${collapsed}`;\n}\n\nfunction resolveMetadataUrl(value: unknown, metadataBase?: string): string | undefined {\n  const normalized = normalizeContent(value);\n  if (!normalized) return undefined;\n  if (!metadataBase) return normalized;\n\n  try {\n    return new URL(normalized, metadataBase).toString();\n  } catch {\n    return normalized;\n  }\n}\n\nfunction normalizeNumber(value: unknown): number | undefined {\n  if (typeof value === \"number\" && Number.isFinite(value)) return value;\n  if (typeof value === \"string\") {\n    const parsed = Number(value);\n    return Number.isFinite(parsed) ? parsed : undefined;\n  }\n  return undefined;\n}\n\nfunction normalizeContent(value: unknown): string | undefined {\n  if (value == null) return undefined;\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n  if (value instanceof URL) return value.toString();\n  return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, any> {\n  return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction escapeText(value: string): string {\n  return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n  return escapeText(value).replace(/\"/g, \"&quot;\");\n}\n","import { renderMetadataHead, resolveMetadataTitle } from \"../metadata\";\nimport type { Metadata } from \"../types\";\n\nexport type NavigationMetadata = (Metadata & Record<string, any>) | undefined;\n\n/** Marks head elements this reconciler inserted, so they can be replaced. */\nconst MANAGED_ATTRIBUTE = \"data-farm-metadata\";\n\n/**\n * Head tags the metadata system owns outright. These are swept on every\n * navigation whether or not they carry the managed marker, because the tags\n * rendered by the server for the first page have no marker and must not\n * survive into the next page's head.\n */\nconst OWNED_SELECTORS = [\n  'meta[name=\"description\"]',\n  'meta[name=\"keywords\"]',\n  'meta[name=\"author\"]',\n  'meta[name=\"creator\"]',\n  'meta[name=\"publisher\"]',\n  'meta[name=\"robots\"]',\n  'link[rel=\"author\"]',\n  'link[rel=\"canonical\"]',\n  'link[rel=\"alternate\"]',\n  'meta[property^=\"og:\"]',\n  'meta[name^=\"twitter:\"]',\n].join(\", \");\n\n/**\n * Icons and the web-app manifest have document-level defaults that exist\n * outside page metadata (the default favicon, a discovered manifest route), so\n * an absent value means \"keep what the document has\", not \"remove it\". They\n * are only swept when the next page defines its own.\n */\nconst ICON_SELECTORS = [\n  'link[rel=\"icon\"]',\n  'link[rel=\"shortcut icon\"]',\n  'link[rel=\"apple-touch-icon\"]',\n].join(\", \");\nconst MANIFEST_SELECTOR = 'link[rel=\"manifest\"]';\n\nfunction removeAll(selector: string): void {\n  for (const element of Array.from(document.head.querySelectorAll(selector))) {\n    element.remove();\n  }\n}\n\n/**\n * Make the document head for a client-side navigation match what a full-page\n * load of the target route renders: same title resolution and the same managed\n * tag set, produced by the same `renderMetadataHead` the server uses.\n *\n * JSON-LD is deliberately untouched: the agent JSON-LD script is site identity\n * rather than page metadata, and sweeping ld+json scripts could remove ones the\n * application authored itself.\n */\nexport function applyFarmMetadataToDocument(metadata: NavigationMetadata, pathname: string): void {\n  document.title = resolveMetadataTitle(metadata?.title) || \"Farm.js App\";\n\n  const rendered = renderMetadataHead(metadata, { pathname });\n  const template = document.createElement(\"template\");\n  template.innerHTML = rendered.tags;\n\n  removeAll(OWNED_SELECTORS);\n  if (metadata?.icons) removeAll(ICON_SELECTORS);\n  if (metadata?.manifest) removeAll(MANIFEST_SELECTOR);\n\n  for (const element of Array.from(template.content.children)) {\n    element.setAttribute(MANAGED_ATTRIBUTE, \"\");\n    document.head.appendChild(element);\n  }\n}\n","import IntlMessageFormat from \"intl-messageformat\";\nimport { getActiveFarmI18nSnapshot } from \"./bridge\";\nimport { localizeFarmHref, resolveFarmLocalePath } from \"./routing\";\nimport type {\n  FarmI18nClientSnapshot,\n  FarmI18nLocale,\n  FarmI18nMessageArgs,\n  FarmI18nMessageKey,\n  FarmTranslator,\n} from \"./types\";\n\ntype Listener = () => void;\n\nconst listeners = new Set<Listener>();\nconst compiled = new Map<string, IntlMessageFormat>();\nlet currentSnapshot: FarmI18nClientSnapshot | undefined;\n\nexport function getFarmI18nClientState(): FarmI18nClientSnapshot | undefined {\n  return currentSnapshot || getActiveFarmI18nSnapshot();\n}\n\nexport function subscribeFarmI18n(listener: Listener): () => void {\n  listeners.add(listener);\n  return () => listeners.delete(listener);\n}\n\nexport function _hydrateFarmI18n(snapshot: FarmI18nClientSnapshot | undefined): void {\n  if (!snapshot) return;\n  const changed = currentSnapshot?.locale !== snapshot.locale;\n  currentSnapshot = snapshot;\n  if (typeof window !== \"undefined\") window.__FARM_I18N__ = snapshot;\n  if (typeof document !== \"undefined\") {\n    document.documentElement.lang = snapshot.locale;\n    document.documentElement.dir = snapshot.direction;\n  }\n  if (changed) compiled.clear();\n  for (const listener of listeners) listener();\n}\n\n// Only own catalog entries count. `snapshot.messages` is a spread object that\n// inherits Object.prototype, so a bare lookup for a key like \"toString\" or\n// \"constructor\" would resolve to a native method. The server side guards the\n// same way (readOwnMessage), so without this the client diverges: the server\n// renders the literal key while the client feeds a function to IntlMessageFormat\n// and throws during hydration.\nconst readOwnMessage = (messages: Record<string, string>, key: string): string | undefined =>\n  Object.prototype.hasOwnProperty.call(messages, key) ? messages[key] : undefined;\n\nconst translate = (key: string, values?: Record<string, unknown>, rich = false): unknown => {\n  const snapshot = requireSnapshot();\n  const message = readOwnMessage(snapshot.messages, key);\n  if (message === undefined) return key;\n  const cacheKey = `${snapshot.locale}\\u0000${key}\\u0000${message}`;\n  let formatter = compiled.get(cacheKey);\n  if (!formatter) {\n    formatter = new IntlMessageFormat(message, snapshot.locale);\n    compiled.set(cacheKey, formatter);\n  }\n  const result = formatter.format(values as any);\n  if (rich) return Array.isArray(result) && result.length === 1 ? result[0] : result;\n  if (Array.isArray(result) && result.some((part) => typeof part !== \"string\")) {\n    throw new Error(`Farm i18n message \"${key}\" contains rich content. Render it with t.rich().`);\n  }\n  return Array.isArray(result) ? result.join(\"\") : String(result);\n};\n\nexport const t = ((key: string, values?: Record<string, unknown>) =>\n  translate(key, values)) as FarmTranslator;\nt.rich = (key: string, values?: Record<string, unknown>) => translate(key, values, true);\nt.raw = (key: string) => readOwnMessage(requireSnapshot().messages, key) ?? key;\nt.has = (key: string) => Object.prototype.hasOwnProperty.call(requireSnapshot().messages, key);\n\nexport function localizeActiveFarmHref(href: string, locale?: FarmI18nLocale): string {\n  const snapshot = getFarmI18nClientState();\n  if (!snapshot) return href;\n  return localizeFarmHref(href, locale || snapshot.locale, snapshot);\n}\n\nexport function isFarmLocaleChangeHref(href: string): boolean {\n  const snapshot = getFarmI18nClientState();\n  if (!snapshot || typeof window === \"undefined\") return false;\n  if (snapshot.routing === \"none\") return false;\n  const target = new URL(href, window.location.origin);\n  const match = resolveFarmLocalePath(target.pathname, snapshot);\n  const targetLocale = match.locale || snapshot.defaultLocale;\n  return targetLocale !== snapshot.locale;\n}\n\nexport function createFarmClientTranslator(): FarmTranslator {\n  return (<TKey extends FarmI18nMessageKey>(key: TKey, ...args: FarmI18nMessageArgs<TKey>) =>\n    t(key, ...args)) as FarmTranslator;\n}\n\nfunction requireSnapshot(): FarmI18nClientSnapshot {\n  const snapshot = getFarmI18nClientState();\n  if (!snapshot) {\n    throw new Error(\"Farm i18n is not configured or has not been hydrated.\");\n  }\n  return snapshot;\n}\n","import type { FarmI18nClientSnapshot } from \"./types\";\n\ntype SnapshotResolver = () => FarmI18nClientSnapshot | undefined;\n\nconst FARM_I18N_SNAPSHOT_RESOLVER = Symbol.for(\"farm.i18n.snapshotResolver\");\ntype GlobalWithI18nResolver = typeof globalThis & {\n  [FARM_I18N_SNAPSHOT_RESOLVER]?: SnapshotResolver;\n};\n\nexport function _setFarmI18nSnapshotResolver(resolver: SnapshotResolver | undefined): void {\n  (globalThis as GlobalWithI18nResolver)[FARM_I18N_SNAPSHOT_RESOLVER] = resolver;\n}\n\nexport function getActiveFarmI18nSnapshot(): FarmI18nClientSnapshot | undefined {\n  if (typeof window !== \"undefined\" && window.__FARM_I18N__) {\n    return window.__FARM_I18N__;\n  }\n  return (globalThis as GlobalWithI18nResolver)[FARM_I18N_SNAPSHOT_RESOLVER]?.();\n}\n","const FARM_BASE_PATH = Symbol.for(\"farm.basePath\");\n\nfunction getFarmGlobalState(): Record<PropertyKey, unknown> {\n  return globalThis as unknown as Record<PropertyKey, unknown>;\n}\n\n/** @internal Configure the app-wide base path for framework link rendering. */\nexport function setFarmBasePath(basePath: string | undefined): void {\n  getFarmGlobalState()[FARM_BASE_PATH] = normalizeFarmBasePath(basePath);\n}\n\n/** @internal Read the app-wide base path used by framework links. */\nexport function getFarmBasePath(): string {\n  return (getFarmGlobalState()[FARM_BASE_PATH] as string | undefined) ?? \"\";\n}\n\nexport function applyFarmBasePath(href: string, basePath = getFarmBasePath()): string {\n  const normalizedBasePath = normalizeFarmBasePath(basePath);\n  if (!normalizedBasePath || !href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n  const canonicalHref = canonicalizeAppRelativeHref(href);\n  if (\n    canonicalHref === normalizedBasePath ||\n    canonicalHref.startsWith(`${normalizedBasePath}/`) ||\n    canonicalHref.startsWith(`${normalizedBasePath}?`) ||\n    canonicalHref.startsWith(`${normalizedBasePath}#`)\n  ) {\n    return canonicalHref;\n  }\n  return `${normalizedBasePath}${canonicalHref}`;\n}\n\nfunction canonicalizeAppRelativeHref(href: string): string {\n  const origin = \"http://farm.local\";\n  const resolved = new URL(href, origin);\n  if (resolved.origin !== origin) {\n    throw new Error(\"Farm app-relative href cannot change the URL origin.\");\n  }\n  return `${resolved.pathname}${resolved.search}${resolved.hash}`;\n}\n\nexport function stripFarmBasePath(pathname: string, basePath = getFarmBasePath()): string {\n  const normalizedBasePath = normalizeFarmBasePath(basePath);\n  if (!normalizedBasePath) return pathname || \"/\";\n  if (pathname === normalizedBasePath) return \"/\";\n  if (!pathname.startsWith(`${normalizedBasePath}/`)) return pathname || \"/\";\n  return pathname.slice(normalizedBasePath.length) || \"/\";\n}\n\nexport function normalizeFarmBasePath(basePath: string | undefined): string {\n  if (!basePath || basePath === \"/\") return \"\";\n\n  const hasUnstableCharacters = (candidate: string) =>\n    candidate.includes(\"\\\\\") ||\n    Array.from(candidate).some((character) => {\n      const code = character.charCodeAt(0);\n      return code <= 31 || (code >= 127 && code <= 159);\n    });\n\n  if (hasUnstableCharacters(basePath)) {\n    throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n  }\n\n  const pathname = basePath.trim();\n  if (!pathname || pathname === \"/\") return \"\";\n  if (pathname.includes(\"?\") || pathname.includes(\"#\")) {\n    throw new Error(\"Farm basePath cannot contain a query string or hash.\");\n  }\n  if (pathname.startsWith(\"//\") || /^[a-z][a-z\\d+.-]*:\\/\\//i.test(pathname)) {\n    throw new Error('Farm basePath must be a pathname such as \"/docs\", not a URL.');\n  }\n\n  for (const segment of pathname.split(\"/\")) {\n    let decoded = segment;\n    try {\n      decoded = decodeURIComponent(segment);\n    } catch {\n      // Malformed escapes remain literal in URL pathnames and cannot be dot segments.\n    }\n    if (hasUnstableCharacters(decoded)) {\n      throw new Error(\"Farm basePath cannot contain backslashes or control characters.\");\n    }\n    if (decoded.includes(\"/\")) {\n      throw new Error(\"Farm basePath cannot contain percent-encoded path separators.\");\n    }\n    if (decoded === \".\" || decoded === \"..\") {\n      throw new Error('Farm basePath cannot contain \".\" or \"..\" path segments.');\n    }\n  }\n\n  return `/${pathname}`.replace(/\\/{2,}/g, \"/\").replace(/\\/+$/, \"\");\n}\n\n/** Normalize a configured application base path while preserving `/` for root. */\nexport function normalizeFarmConfigBasePath(basePath: string | undefined): string {\n  return normalizeFarmBasePath(basePath) || \"/\";\n}\n","import { applyFarmBasePath, stripFarmBasePath } from \"../base-path\";\nimport type { FarmI18nDirection, FarmI18nRouting, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocalePathConfig {\n  locales: readonly string[];\n  defaultLocale: string;\n  routing: FarmI18nRouting;\n  basePath?: string;\n}\n\nexport interface FarmLocalePathMatch {\n  locale?: string;\n  pathname: string;\n  explicit: boolean;\n}\n\nconst RTL_LANGUAGES = new Set([\n  \"ar\",\n  \"arc\",\n  \"ckb\",\n  \"dv\",\n  \"fa\",\n  \"he\",\n  \"ku\",\n  \"nqo\",\n  \"ps\",\n  \"sd\",\n  \"syr\",\n  \"ug\",\n  \"ur\",\n  \"yi\",\n]);\n\nexport function resolveFarmLocalePath(\n  pathname: string,\n  config: FarmLocalePathConfig,\n): FarmLocalePathMatch {\n  const normalized = normalizePathname(stripFarmBasePath(pathname, config.basePath));\n  if (config.routing === \"none\") {\n    return { pathname: normalized, explicit: false };\n  }\n\n  const segments = normalized.split(\"/\").filter(Boolean);\n  const firstSegment = segments[0];\n  const locale = config.locales.find(\n    (candidate) => candidate.toLowerCase() === firstSegment?.toLowerCase(),\n  );\n  if (!locale) {\n    return { pathname: normalized, explicit: false };\n  }\n\n  const remaining = segments.slice(1);\n  return {\n    locale,\n    pathname: remaining.length > 0 ? `/${remaining.join(\"/\")}` : \"/\",\n    explicit: true,\n  };\n}\n\nexport function stripFarmLocaleFromPathname(\n  pathname: string,\n  config: FarmLocalePathConfig,\n): string {\n  return resolveFarmLocalePath(pathname, config).pathname;\n}\n\nexport function localizeFarmPathname(\n  pathname: string,\n  locale: string,\n  config: FarmLocalePathConfig,\n): string {\n  const internalPathname = resolveFarmLocalePath(pathname, config).pathname;\n  let localizedPathname = internalPathname;\n  if (config.routing === \"none\") {\n    return applyFarmBasePath(localizedPathname, config.basePath);\n  }\n  if (config.routing === \"prefix-except-default\" && locale === config.defaultLocale) {\n    return applyFarmBasePath(localizedPathname, config.basePath);\n  }\n  localizedPathname = internalPathname === \"/\" ? `/${locale}` : `/${locale}${internalPathname}`;\n  return applyFarmBasePath(localizedPathname, config.basePath);\n}\n\nexport function localizeFarmHref(\n  href: string,\n  locale: string,\n  config: FarmLocalePathConfig,\n): string {\n  if (!href.startsWith(\"/\") || href.startsWith(\"//\")) return href;\n  const url = new URL(href, \"http://farm.local\");\n  url.pathname = localizeFarmPathname(url.pathname, locale, config);\n  return `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function getFarmLocaleDirection(\n  locale: string,\n  direction: ResolvedFarmI18nConfig[\"direction\"] | undefined,\n): FarmI18nDirection {\n  const configured = direction?.[locale];\n  if (configured) return configured;\n  const language = locale.split(\"-\")[0]?.toLowerCase() || locale.toLowerCase();\n  return RTL_LANGUAGES.has(language) ? \"rtl\" : \"ltr\";\n}\n\nfunction normalizePathname(pathname: string): string {\n  const withLeadingSlash = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n  if (withLeadingSlash === \"/\") return \"/\";\n  return withLeadingSlash.replace(/\\/{2,}/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n}\n","\"use client\";\n\nimport { readDeferredDataResponse } from \"../deferred\";\nimport { notifyHistoryChange, notifyRouterHistoryChange } from \"./history-sync\";\nimport {\n  createFarmDeploymentMismatchError,\n  createFarmDeploymentRequestHeaders,\n  isFarmDeploymentMismatchResponse,\n} from \"../deployment\";\nimport { getHashTargetElement } from \"./hash-target\";\nimport { isFarmExternalNavigationURL, resolveFarmNavigationURL } from \"./navigation-url\";\nimport { applyFarmMetadataToDocument, type NavigationMetadata } from \"./metadata-reconciler\";\nimport type { FarmClientNavigationSession, FarmClientPluginManager } from \"./plugin\";\nimport { _hydrateFarmI18n, isFarmLocaleChangeHref } from \"../i18n/client-runtime\";\nimport type { FarmI18nClientSnapshot } from \"../i18n/types\";\nimport type { FarmIslandStrategy } from \"../island\";\nimport type { FarmRouteRenderPlan } from \"../navigation/render-plan\";\n\nexport { getHashTargetElement } from \"./hash-target\";\nexport { isFarmExternalNavigationURL } from \"./navigation-url\";\n\n/**\n * Farm.js SPA Router\n *\n * Provides client-side navigation without full page reloads.\n * Features:\n * - Prefetch on viewport intersection\n * - Prefetch on hover\n * - Page caching\n * - History API integration\n * - Scroll restoration\n */\n\ninterface PageData {\n  props: Record<string, any>;\n  modulePath: string;\n  loadingModulePath?: string | null;\n  canonicalPath?: string;\n  isClientComponent?: boolean;\n  shouldHydrate?: boolean;\n  islandStrategy?: FarmIslandStrategy | null;\n  renderPlan?: FarmRouteRenderPlan;\n  fragment?: {\n    html: string;\n    layoutPatterns: string[];\n  };\n  metadata?: NavigationMetadata;\n  layoutModules?: string[];\n  routeSlots?: RouteSlotPageData[];\n  interception?: {\n    from?: string;\n    slots: string[];\n  };\n  i18n?: FarmI18nClientSnapshot;\n}\n\ninterface RouteSlotPageData {\n  name: string;\n  ownerPattern: string;\n  containerId: string;\n  interception: boolean;\n  fallback: boolean;\n  modulePath: string;\n  isClientComponent: boolean;\n  shouldHydrate: boolean;\n  props: Record<string, any>;\n}\n\nexport interface RouterOptions {\n  prefetchTimeout?: number;\n  cacheMaxAge?: number;\n  scrollRestoration?: boolean;\n  shouldUseDocumentNavigation?: (pathname: string) => boolean;\n  deploymentId?: string;\n}\n\ninterface CacheEntry {\n  data: PageData;\n  timestamp: number;\n}\n\nexport interface FarmNavigationBlockerContext {\n  from: string;\n  to: string;\n  action: \"push\" | \"replace\" | \"pop\";\n}\n\nexport type FarmNavigationBlocker = (\n  context: FarmNavigationBlockerContext,\n) => boolean | void | Promise<boolean | void>;\n\nexport type FarmViewTransitionMode = boolean | \"auto\";\n\nexport interface FarmNavigateOptions {\n  replace?: boolean;\n  scroll?: boolean;\n  state?: unknown;\n  viewTransition?: FarmViewTransitionMode;\n  /** Re-fetch the current route even when its URL has not changed. */\n  refresh?: boolean;\n}\n\nexport interface FarmNavigationLocation {\n  href: string;\n  pathname: string;\n  search: string;\n  hash: string;\n}\n\nexport interface FarmNavigationState {\n  state: \"idle\" | \"loading\";\n  pending: boolean;\n  from: string | null;\n  to: FarmNavigationLocation | null;\n  action: FarmNavigationBlockerContext[\"action\"] | null;\n  startedAt: number | null;\n}\n\nexport type FarmNavigationListener = (state: FarmNavigationState) => void;\n\nconst FARM_PAGE_STATE_KEY = \"__farmPageState\";\nconst FARM_INTERCEPT_FROM_KEY = \"__farmInterceptFrom\";\nconst FARM_HISTORY_INDEX_KEY = \"__farmHistoryIndex\";\n\nfunction readHistoryIndex(state: unknown): number | null {\n  if (!state || typeof state !== \"object\") return null;\n  const value = (state as Record<string, unknown>)[FARM_HISTORY_INDEX_KEY];\n  return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\nconst IDLE_NAVIGATION_STATE: FarmNavigationState = {\n  state: \"idle\",\n  pending: false,\n  from: null,\n  to: null,\n  action: null,\n  startedAt: null,\n};\n\nfunction getActiveLayoutChainHeader(): string | undefined {\n  if (typeof document === \"undefined\") return undefined;\n  const patterns = Array.from(\n    document.querySelectorAll<HTMLElement>('[data-farm-layout-boundary=\"true\"]'),\n  )\n    .map((element) => element.dataset.farmLayoutPattern)\n    .filter((pattern): pattern is string => Boolean(pattern));\n  return patterns.length > 0 ? JSON.stringify(patterns) : undefined;\n}\n\n// Global router instance\nlet routerInstance: SPARouter | null = null;\n\nexport class SPARouter {\n  private cache: Map<string, CacheEntry> = new Map();\n  private prefetchingUrls: Set<string> = new Set();\n  private observers: Map<Element, IntersectionObserver> = new Map();\n  private prefetchTimers: Map<Element, ReturnType<typeof setTimeout>> = new Map();\n  private blockers: Set<FarmNavigationBlocker> = new Set();\n  private unloadBlockers: Map<FarmNavigationBlocker, () => boolean> = new Map();\n  private navigationListeners: Set<FarmNavigationListener> = new Set();\n  private navigationState: FarmNavigationState = IDLE_NAVIGATION_STATE;\n  private currentHistoryPath: string | null = null;\n  private currentHistoryIndex: number | null = null;\n  private suppressNextPopState = false;\n  private navigationSequence = 0;\n  private activeNavigation?: {\n    id: number;\n    controller: AbortController;\n  };\n  private scrollElements: Map<string, HTMLElement> = new Map();\n  private options: Required<Omit<RouterOptions, \"deploymentId\">> &\n    Pick<RouterOptions, \"deploymentId\">;\n  private onNavigate?: (data: PageData) => Promise<void>;\n  private clientPlugins?: Pick<\n    FarmClientPluginManager,\n    | \"beginNavigation\"\n    | \"markNavigationLoaded\"\n    | \"resolveNavigation\"\n    | \"scheduleNavigationRendered\"\n    | \"failNavigation\"\n  >;\n\n  private readonly onPopState = (event: PopStateEvent) => {\n    void this.handlePopState(event);\n  };\n\n  private readonly onBeforeUnload = (event: BeforeUnloadEvent) => {\n    if (this.shouldBlockUnload()) {\n      event.preventDefault();\n      event.returnValue = \"\";\n    }\n    this.saveScrollPosition(window.location.pathname + window.location.search);\n  };\n\n  constructor(options: RouterOptions = {}) {\n    this.options = {\n      prefetchTimeout: options.prefetchTimeout ?? 100,\n      cacheMaxAge: options.cacheMaxAge ?? 30000, // 30 seconds\n      scrollRestoration: options.scrollRestoration ?? true,\n      shouldUseDocumentNavigation: options.shouldUseDocumentNavigation ?? (() => false),\n      deploymentId: options.deploymentId ?? readBrowserDeploymentId(),\n    };\n\n    if (typeof window !== \"undefined\") {\n      // Listen for popstate (back/forward navigation)\n      window.addEventListener(\"popstate\", this.onPopState);\n\n      // Save scroll position before unload\n      window.addEventListener(\"beforeunload\", this.onBeforeUnload);\n\n      // Track the rendered location and its position in the history stack so\n      // popstate can report a real `from` and revert blocked traversals.\n      this.currentHistoryPath = window.location.pathname + window.location.search;\n      const existingIndex = readHistoryIndex(window.history.state);\n      if (existingIndex == null) {\n        try {\n          window.history.replaceState(\n            {\n              ...((window.history.state as object | null) ?? {}),\n              [FARM_HISTORY_INDEX_KEY]: 0,\n            },\n            \"\",\n            window.location.href,\n          );\n          this.currentHistoryIndex = 0;\n        } catch {\n          this.currentHistoryIndex = null;\n        }\n      } else {\n        this.currentHistoryIndex = existingIndex;\n      }\n    }\n  }\n\n  /** Remove global listeners. Intended for tests and teardown. */\n  destroy(): void {\n    if (typeof window === \"undefined\") return;\n    this.cancelActiveNavigation();\n    for (const observer of this.observers.values()) observer.disconnect();\n    for (const timer of this.prefetchTimers.values()) clearTimeout(timer);\n    this.observers.clear();\n    this.prefetchTimers.clear();\n    window.removeEventListener(\"popstate\", this.onPopState);\n    window.removeEventListener(\"beforeunload\", this.onBeforeUnload);\n  }\n\n  /**\n   * Set the navigation handler that updates React\n   */\n  setNavigationHandler(handler: (data: PageData) => Promise<void>) {\n    this.onNavigate = handler;\n  }\n\n  /**\n   * Connect Farm's browser plugin lifecycle to SPA navigation.\n   */\n  setClientPluginManager(manager: FarmClientPluginManager) {\n    this.clientPlugins = manager;\n  }\n\n  /**\n   * Navigate to a new URL\n   */\n  async navigate(href: string, options: FarmNavigateOptions = {}): Promise<void> {\n    const {\n      replace = false,\n      scroll = true,\n      state,\n      viewTransition = false,\n      refresh = false,\n    } = options;\n\n    // Relative targets resolve against the current document, not the origin.\n    const url = resolveFarmNavigationURL(href, window.location.href);\n    const pathname = url.pathname;\n    const search = url.search;\n    const fullPath = pathname + search;\n\n    if (\n      isFarmExternalNavigationURL(url, window.location.origin) ||\n      isFarmLocaleChangeHref(url.toString()) ||\n      this.options.shouldUseDocumentNavigation(pathname)\n    ) {\n      this.cancelActiveNavigation();\n      if (replace) window.location.replace(url.toString());\n      else window.location.assign(url.toString());\n      return;\n    }\n\n    // Same page navigation - update fragment history without fetching route data.\n    if (!refresh && pathname === window.location.pathname && search === window.location.search) {\n      this.cancelActiveNavigation();\n      if (url.hash === window.location.hash) return;\n\n      this.writePageState(\n        replace ? \"replace\" : \"push\",\n        state === undefined ? readPageState() : state,\n        url.toString(),\n      );\n      if (scroll) {\n        if (url.hash) {\n          getHashTargetElement(url.hash)?.scrollIntoView();\n        } else {\n          window.scrollTo(0, 0);\n        }\n      }\n      return;\n    }\n\n    const from = window.location.pathname + window.location.search;\n    if (\n      await this.shouldBlockNavigation({\n        from,\n        to: fullPath,\n        action: replace ? \"replace\" : \"push\",\n      })\n    ) {\n      return;\n    }\n\n    // Save current scroll position\n    if (this.options.scrollRestoration) {\n      this.saveScrollPosition(window.location.pathname + window.location.search);\n    }\n\n    const navigation = this.startNavigation({\n      from,\n      to: createNavigationLocation(url),\n      action: replace ? \"replace\" : \"push\",\n    });\n\n    let clientNavigation: FarmClientNavigationSession | undefined;\n    try {\n      clientNavigation = await this.clientPlugins?.beginNavigation({\n        from,\n        to: url,\n        action: replace ? \"replace\" : \"push\",\n      });\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      // Fetch page data (from cache or server)\n      const pageData = await this.fetchPageData(\n        fullPath,\n        true,\n        from,\n        refresh,\n        navigation.controller.signal,\n      );\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.markNavigationLoaded(clientNavigation, pageData);\n      }\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      await this.runViewTransition(viewTransition, () =>\n        this.isCurrentNavigation(navigation, clientNavigation)\n          ? this.commitNavigation({\n              fullPath,\n              pageData,\n              pathname,\n              replace,\n              scroll,\n              state,\n              url,\n            })\n          : Promise.resolve(),\n      );\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      if (clientNavigation) {\n        await this.clientPlugins?.resolveNavigation(clientNavigation);\n        void this.clientPlugins?.scheduleNavigationRendered(clientNavigation);\n      }\n      this.finishNavigation(navigation);\n    } catch (error) {\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.failNavigation(clientNavigation, error);\n      }\n      this.finishNavigation(navigation);\n      console.error(\"[Farm.js] Navigation error:\", error);\n      // Fall back to full page navigation\n      window.location.href = href;\n    }\n  }\n\n  /**\n   * Re-render the active route from the server while preserving the document,\n   * shared layouts, client runtime, and browser history entry.\n   */\n  refresh(options: Omit<FarmNavigateOptions, \"replace\" | \"refresh\"> = {}): Promise<void> {\n    return this.navigate(window.location.href, {\n      ...options,\n      replace: true,\n      refresh: true,\n      scroll: options.scroll ?? false,\n    });\n  }\n\n  /**\n   * Prefetch a URL\n   */\n  async prefetch(href: string): Promise<void> {\n    if (isFarmLocaleChangeHref(href)) return;\n    const url = resolveFarmNavigationURL(href, window.location.href);\n    if (isFarmExternalNavigationURL(url, window.location.origin)) return;\n    if (this.options.shouldUseDocumentNavigation(url.pathname)) return;\n    const fullPath = url.pathname + url.search;\n    const interceptFrom = window.location.pathname + window.location.search;\n\n    // Skip if already prefetching or cached\n    if (this.prefetchingUrls.has(fullPath)) return;\n    if (this.isCached(fullPath, interceptFrom)) return;\n\n    this.prefetchingUrls.add(fullPath);\n\n    try {\n      await this.fetchPageData(fullPath, false, interceptFrom);\n    } catch (error) {\n      console.warn(\"[Farm.js] Prefetch failed:\", href, error);\n    } finally {\n      this.prefetchingUrls.delete(fullPath);\n    }\n  }\n\n  /**\n   * Observe an element for viewport intersection (prefetch when visible)\n   */\n  observeForPrefetch(element: HTMLAnchorElement): void {\n    if (typeof IntersectionObserver === \"undefined\") return;\n\n    const href = element.getAttribute(\"href\");\n    if (!href || this.isExternalUrl(href)) return;\n    this.unobserveForPrefetch(element);\n\n    const observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting) {\n            if (this.observers.get(element) !== observer) continue;\n            // Delay prefetch slightly to avoid prefetching during scroll\n            const timer = setTimeout(() => {\n              if (this.prefetchTimers.get(element) !== timer) return;\n              this.prefetchTimers.delete(element);\n              void this.prefetch(href);\n            }, this.options.prefetchTimeout);\n            this.prefetchTimers.set(element, timer);\n\n            // Stop observing after first intersection\n            observer.unobserve(element);\n            this.observers.delete(element);\n          }\n        }\n      },\n      { rootMargin: \"200px\" }, // Start prefetching when 200px from viewport\n    );\n\n    observer.observe(element);\n    this.observers.set(element, observer);\n  }\n\n  /**\n   * Stop observing an element\n   */\n  unobserveForPrefetch(element: HTMLAnchorElement): void {\n    const observer = this.observers.get(element);\n    if (observer) {\n      observer.unobserve(element);\n      this.observers.delete(element);\n    }\n    const timer = this.prefetchTimers.get(element);\n    if (timer !== undefined) {\n      clearTimeout(timer);\n      this.prefetchTimers.delete(element);\n    }\n  }\n\n  addBlocker(blocker: FarmNavigationBlocker, shouldBlockUnload?: () => boolean): () => void {\n    this.blockers.add(blocker);\n    this.unloadBlockers.set(\n      blocker,\n      shouldBlockUnload ?? (() => this.evaluateBlockerForUnload(blocker)),\n    );\n    return () => {\n      this.blockers.delete(blocker);\n      this.unloadBlockers.delete(blocker);\n    };\n  }\n\n  getNavigationState(): FarmNavigationState {\n    return this.navigationState;\n  }\n\n  subscribeNavigation(listener: FarmNavigationListener): () => void {\n    this.navigationListeners.add(listener);\n    listener(this.navigationState);\n    return () => {\n      this.navigationListeners.delete(listener);\n    };\n  }\n\n  registerScrollElement(key: string, element: HTMLElement): () => void {\n    this.scrollElements.set(key, element);\n    this.restoreScrollElement(window.location.pathname + window.location.search, key, element);\n    return () => {\n      if (this.scrollElements.get(key) === element) {\n        this.scrollElements.delete(key);\n      }\n    };\n  }\n\n  pushState(state: unknown, href?: string): void {\n    this.writePageState(\"push\", state, href);\n  }\n\n  replaceState(state: unknown, href?: string): void {\n    this.writePageState(\"replace\", state, href);\n  }\n\n  /** @internal Keep shallow URL-search writes inside the router's history bookkeeping. */\n  writeURLSearch(action: \"push\" | \"replace\", href: string): void {\n    this.writePageState(action, readPageState(), href, false);\n  }\n\n  private async commitNavigation(options: {\n    fullPath: string;\n    pageData: PageData;\n    pathname: string;\n    replace: boolean;\n    scroll: boolean;\n    state: unknown;\n    url: URL;\n  }): Promise<void> {\n    const historyUrl = resolveFarmNavigationURL(\n      options.pageData.canonicalPath || options.fullPath,\n      window.location.href,\n    );\n    historyUrl.hash = options.url.hash;\n    const historyPath = historyUrl.pathname + historyUrl.search + historyUrl.hash;\n    const historyState = createHistoryState(\n      historyPath,\n      options.state,\n      options.replace ? window.history.state : undefined,\n      options.pageData.interception?.from ?? null,\n    ) as Record<string, unknown>;\n    const nextHistoryIndex =\n      this.currentHistoryIndex == null\n        ? null\n        : options.replace\n          ? this.currentHistoryIndex\n          : this.currentHistoryIndex + 1;\n    if (nextHistoryIndex != null) {\n      historyState[FARM_HISTORY_INDEX_KEY] = nextHistoryIndex;\n    }\n    if (options.replace) {\n      window.history.replaceState(historyState, \"\", historyPath);\n    } else {\n      window.history.pushState(historyState, \"\", historyPath);\n    }\n    this.currentHistoryIndex = nextHistoryIndex;\n    const resolvedHistoryUrl = resolveFarmNavigationURL(historyPath, window.location.href);\n    this.currentHistoryPath = resolvedHistoryUrl.pathname + resolvedHistoryUrl.search;\n    notifyRouterHistoryChange();\n\n    this.updateDocumentMetadata(options.pageData.metadata);\n\n    _hydrateFarmI18n(options.pageData.i18n);\n\n    if (this.onNavigate) {\n      await this.onNavigate(options.pageData);\n    }\n\n    if (options.scroll) {\n      if (options.url.hash) {\n        const element = getHashTargetElement(options.url.hash);\n        if (element) {\n          element.scrollIntoView();\n        }\n      } else {\n        window.scrollTo(0, 0);\n      }\n    } else if (this.options.scrollRestoration) {\n      const restorePath = this.currentHistoryPath ?? options.fullPath;\n      this.restoreWindowScroll(restorePath);\n      this.restoreScrollElements(restorePath);\n    }\n  }\n\n  private async runViewTransition(\n    mode: FarmViewTransitionMode,\n    callback: () => Promise<void>,\n  ): Promise<void> {\n    if (!mode || typeof document === \"undefined\") {\n      await callback();\n      return;\n    }\n\n    const startViewTransition = (document as any).startViewTransition;\n    if (typeof startViewTransition !== \"function\") {\n      await callback();\n      return;\n    }\n\n    const transition = startViewTransition.call(document, () => callback());\n    const updateDone = transition?.updateCallbackDone || transition?.ready;\n    if (updateDone && typeof updateDone.then === \"function\") {\n      await updateDone;\n    }\n    transition?.finished?.catch?.(() => undefined);\n  }\n\n  /**\n   * Fetch page data from cache or server\n   */\n  private async fetchPageData(\n    path: string,\n    recover = true,\n    interceptFrom?: string,\n    fresh = false,\n    signal?: AbortSignal,\n  ): Promise<PageData> {\n    const cacheKey = getPageDataCacheKey(path, interceptFrom);\n    // Check cache first\n    const cached = fresh ? undefined : this.cache.get(cacheKey);\n    if (cached && Date.now() - cached.timestamp < this.options.cacheMaxAge) {\n      return cached.data;\n    }\n\n    // Fetch from server. The active layout chain lets the server omit shared\n    // shell HTML from the fragment without inspecting component source.\n    const activeLayoutChain = getActiveLayoutChainHeader();\n    const response = await fetch(`/__farm/page-data?path=${encodeURIComponent(path)}`, {\n      signal,\n      headers: createFarmDeploymentRequestHeaders(this.options.deploymentId, {\n        Accept: \"application/x-farm-deferred+json, application/json\",\n        \"X-Farm-SPA\": \"1\",\n        ...(activeLayoutChain ? { \"X-Farm-Layout-Chain\": activeLayoutChain } : {}),\n        ...(interceptFrom ? { \"X-Farm-Intercept-From\": interceptFrom } : {}),\n      }),\n    });\n\n    if (isFarmDeploymentMismatchResponse(response, this.options.deploymentId)) {\n      const error = createFarmDeploymentMismatchError(\n        response,\n        this.options.deploymentId || \"unknown\",\n      );\n      dispatchDeploymentMismatch(error);\n      if (recover) {\n        window.location.assign(path);\n      }\n      throw error;\n    }\n\n    if (!response.ok) {\n      throw new Error(`Failed to fetch page data: ${response.status}`);\n    }\n\n    const data = await readDeferredDataResponse<PageData>(response);\n\n    // Cache the result. Expiry was previously only consulted on read, so a\n    // long-lived tab that navigates or prefetches many distinct routes grew\n    // this map without bound; sweeping on write bounds it to entries touched\n    // within the cacheMaxAge window.\n    const now = Date.now();\n    for (const [key, entry] of this.cache) {\n      if (now - entry.timestamp >= this.options.cacheMaxAge) this.cache.delete(key);\n    }\n    this.cache.set(cacheKey, {\n      data,\n      timestamp: now,\n    });\n\n    return data;\n  }\n\n  /**\n   * Put the browser URL back on the rendered page after a blocked pop. When\n   * both entries carry a Farm history index the traversal is reversed\n   * exactly; otherwise the current path is pushed again, which restores the\n   * address bar at the cost of one extra history entry.\n   */\n  private revertBlockedPopState(event: PopStateEvent, from: string): void {\n    const eventIndex = readHistoryIndex(event.state);\n    if (eventIndex != null && this.currentHistoryIndex != null) {\n      const delta = eventIndex - this.currentHistoryIndex;\n      if (delta !== 0) {\n        this.suppressNextPopState = true;\n        window.history.go(-delta);\n        return;\n      }\n    }\n\n    try {\n      const restoredState: Record<string, unknown> = {\n        path: from,\n      };\n      if (this.currentHistoryIndex != null && eventIndex != null) {\n        restoredState[FARM_HISTORY_INDEX_KEY] = eventIndex + 1;\n        this.currentHistoryIndex = eventIndex + 1;\n      }\n      window.history.pushState(restoredState, \"\", from);\n    } catch {\n      // Leave the URL as-is if the history API rejects the write; the\n      // rendered page is still the blocked-from page.\n    }\n  }\n\n  /**\n   * Handle browser back/forward navigation\n   */\n  private async handlePopState(event: PopStateEvent): Promise<void> {\n    if (document.documentElement.dataset.farmDocsRuntime === \"true\") return;\n\n    if (this.suppressNextPopState) {\n      // This traversal is our own revert of a blocked pop; the rendered page\n      // never changed.\n      this.suppressNextPopState = false;\n      return;\n    }\n\n    const path = window.location.pathname + window.location.search;\n    // The browser has already moved to the destination entry, so its state\n    // describes `to`; the page still rendered is the tracked current path.\n    const from = this.currentHistoryPath ?? path;\n\n    if (\n      await this.shouldBlockNavigation({\n        from,\n        to: path,\n        action: \"pop\",\n      })\n    ) {\n      this.revertBlockedPopState(event, from);\n      return;\n    }\n\n    this.currentHistoryPath = path;\n    this.currentHistoryIndex = readHistoryIndex(event.state);\n\n    const navigation = this.startNavigation({\n      from,\n      to: createNavigationLocation(new URL(window.location.href)),\n      action: \"pop\",\n    });\n\n    let clientNavigation: FarmClientNavigationSession | undefined;\n    try {\n      clientNavigation = await this.clientPlugins?.beginNavigation({\n        from: null,\n        to: window.location.href,\n        action: \"pop\",\n      });\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      const interceptFrom =\n        typeof event.state?.[FARM_INTERCEPT_FROM_KEY] === \"string\"\n          ? event.state[FARM_INTERCEPT_FROM_KEY]\n          : undefined;\n      const pageData = await this.fetchPageData(\n        path,\n        true,\n        interceptFrom,\n        false,\n        navigation.controller.signal,\n      );\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.markNavigationLoaded(clientNavigation, pageData);\n      }\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n\n      this.updateDocumentMetadata(pageData.metadata);\n\n      _hydrateFarmI18n(pageData.i18n);\n\n      // Call the navigation handler to update React\n      if (this.onNavigate) {\n        await this.onNavigate(pageData);\n      }\n\n      // A fragment in the destination URL is an explicit scroll target for the\n      // window and takes precedence over the saved *window* scroll position,\n      // matching forward navigation and native browser back/forward. Element\n      // scroll positions are keyed without the hash (see\n      // getScrollElementStorageKey), so registered scroll containers are\n      // restored regardless of whether a fragment is present, even when the\n      // anchor resolves, so a persistent-layout scroll element is not left at\n      // the prior route's offset on a hash-destination popstate.\n      const destinationPath = window.location.pathname + window.location.search;\n      if (window.location.hash) {\n        const target = getHashTargetElement(window.location.hash);\n        if (target) {\n          target.scrollIntoView();\n        } else if (this.options.scrollRestoration) {\n          this.restoreWindowScroll(destinationPath);\n        }\n      } else if (this.options.scrollRestoration) {\n        this.restoreWindowScroll(destinationPath);\n      }\n      if (this.options.scrollRestoration) {\n        this.restoreScrollElements(destinationPath);\n      }\n\n      if (clientNavigation) {\n        await this.clientPlugins?.resolveNavigation(clientNavigation);\n        void this.clientPlugins?.scheduleNavigationRendered(clientNavigation);\n      }\n      this.finishNavigation(navigation);\n    } catch (error) {\n      if (!this.isCurrentNavigation(navigation, clientNavigation)) return;\n      if (clientNavigation) {\n        await this.clientPlugins?.failNavigation(clientNavigation, error);\n      }\n      this.finishNavigation(navigation);\n      console.error(\"[Farm.js] Popstate navigation error:\", error);\n      // Reload the page as fallback\n      window.location.reload();\n    }\n  }\n\n  /**\n   * Check if URL is cached\n   */\n  private isCached(path: string, interceptFrom?: string): boolean {\n    const cached = this.cache.get(getPageDataCacheKey(path, interceptFrom));\n    return cached !== undefined && Date.now() - cached.timestamp < this.options.cacheMaxAge;\n  }\n\n  /**\n   * Check if URL is external\n   */\n  private isExternalUrl(href: string): boolean {\n    return href.startsWith(\"http://\") || href.startsWith(\"https://\") || href.startsWith(\"//\");\n  }\n\n  private async shouldBlockNavigation(context: FarmNavigationBlockerContext): Promise<boolean> {\n    for (const blocker of this.blockers) {\n      if (await blocker(context)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private evaluateBlockerForUnload(blocker: FarmNavigationBlocker): boolean {\n    const path = window.location.pathname + window.location.search;\n    const result = blocker({ from: path, to: path, action: \"replace\" });\n    if (result && typeof result !== \"boolean\") {\n      void result.catch(() => undefined);\n      return true;\n    }\n    return result === true;\n  }\n\n  private shouldBlockUnload(): boolean {\n    for (const blocker of this.blockers) {\n      try {\n        if (this.unloadBlockers.get(blocker)?.()) return true;\n      } catch {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private updateDocumentMetadata(metadata: PageData[\"metadata\"]): void {\n    // Both call sites run after the history entry is committed, so the current\n    // pathname is the navigated-to page and drives the default canonical.\n    applyFarmMetadataToDocument(metadata, window.location.pathname);\n  }\n\n  private startNavigation(options: {\n    from: string;\n    to: FarmNavigationLocation;\n    action: FarmNavigationBlockerContext[\"action\"];\n  }): { id: number; controller: AbortController } {\n    this.activeNavigation?.controller.abort(\"superseded\");\n    const navigation = {\n      id: ++this.navigationSequence,\n      controller: new AbortController(),\n    };\n    this.activeNavigation = navigation;\n    this.setNavigationState({\n      state: \"loading\",\n      pending: true,\n      from: options.from,\n      to: options.to,\n      action: options.action,\n      startedAt: Date.now(),\n    });\n    return navigation;\n  }\n\n  private isCurrentNavigation(\n    navigation: { id: number; controller: AbortController },\n    clientNavigation?: FarmClientNavigationSession,\n  ): boolean {\n    return (\n      this.activeNavigation?.id === navigation.id &&\n      !navigation.controller.signal.aborted &&\n      !clientNavigation?.signal.aborted\n    );\n  }\n\n  private finishNavigation(navigation: { id: number; controller: AbortController }): void {\n    if (this.activeNavigation?.id !== navigation.id) return;\n    this.activeNavigation = undefined;\n    this.setNavigationState(IDLE_NAVIGATION_STATE);\n  }\n\n  private cancelActiveNavigation(): void {\n    if (!this.activeNavigation) return;\n    this.activeNavigation.controller.abort(\"superseded\");\n    this.activeNavigation = undefined;\n    this.setNavigationState(IDLE_NAVIGATION_STATE);\n  }\n\n  private setNavigationState(state: FarmNavigationState): void {\n    this.navigationState = state;\n    for (const listener of this.navigationListeners) {\n      listener(state);\n    }\n  }\n\n  private writePageState(\n    action: \"push\" | \"replace\",\n    state: unknown,\n    href?: string,\n    notify = true,\n  ): void {\n    if (typeof window === \"undefined\") return;\n\n    const url = href\n      ? resolveFarmNavigationURL(href, window.location.href).toString()\n      : window.location.href;\n    const parsedUrl = new URL(url);\n    const nextPath = parsedUrl.pathname + parsedUrl.search;\n    const historyPath = nextPath + parsedUrl.hash;\n    const nextState = createHistoryState(historyPath, state, window.history.state) as Record<\n      string,\n      unknown\n    >;\n\n    if (action === \"replace\") {\n      window.history.replaceState(nextState, \"\", url);\n    } else {\n      if (this.currentHistoryIndex != null) {\n        nextState[FARM_HISTORY_INDEX_KEY] = this.currentHistoryIndex + 1;\n      }\n      window.history.pushState(nextState, \"\", url);\n      this.currentHistoryIndex =\n        this.currentHistoryIndex == null ? null : this.currentHistoryIndex + 1;\n    }\n    this.currentHistoryPath = nextPath;\n\n    if (notify) notifyHistoryChange(\"page-state\");\n  }\n\n  /**\n   * Save scroll position for a path\n   */\n  private saveScrollPosition(path: string): void {\n    try {\n      sessionStorage.setItem(\n        `farm-scroll-${path}`,\n        JSON.stringify({ x: window.scrollX, y: window.scrollY }),\n      );\n      for (const [key, element] of this.scrollElements) {\n        sessionStorage.setItem(\n          getScrollElementStorageKey(path, key),\n          JSON.stringify({ x: element.scrollLeft, y: element.scrollTop }),\n        );\n      }\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  /**\n   * Restore the saved window scroll position for a path.\n   */\n  private restoreWindowScroll(path: string): void {\n    try {\n      const saved = sessionStorage.getItem(`farm-scroll-${path}`);\n      if (saved) {\n        const { x, y } = JSON.parse(saved);\n        setTimeout(() => window.scrollTo(x, y), 0);\n      }\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  /**\n   * Restore saved scroll positions for every registered scroll element. Keys\n   * are hash-stripped (see getScrollElementStorageKey), so this runs regardless\n   * of whether the destination URL carries a fragment.\n   */\n  private restoreScrollElements(path: string): void {\n    try {\n      for (const [key, element] of this.scrollElements) {\n        this.restoreScrollElement(path, key, element);\n      }\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  private restoreScrollElement(path: string, key: string, element: HTMLElement): void {\n    try {\n      const saved = sessionStorage.getItem(getScrollElementStorageKey(path, key));\n      if (!saved) return;\n      const { x, y } = JSON.parse(saved);\n      setTimeout(() => {\n        element.scrollLeft = x;\n        element.scrollTop = y;\n      }, 0);\n    } catch {\n      // Ignore storage errors\n    }\n  }\n\n  /**\n   * Clear the page cache\n   */\n  clearCache(): void {\n    this.cache.clear();\n  }\n}\n\nfunction readBrowserDeploymentId(): string | undefined {\n  if (typeof window === \"undefined\") return undefined;\n\n  const runtimeId = (window as Window & { __FARM_DEPLOYMENT_ID__?: unknown })\n    .__FARM_DEPLOYMENT_ID__;\n  if (typeof runtimeId === \"string\" && runtimeId) return runtimeId;\n\n  return document.querySelector<HTMLMetaElement>('meta[name=\"farm-deployment-id\"]')?.content;\n}\n\nfunction dispatchDeploymentMismatch(error: Error): void {\n  if (typeof window === \"undefined\" || typeof CustomEvent === \"undefined\") return;\n  window.dispatchEvent(new CustomEvent(\"farm:deployment-mismatch\", { detail: error }));\n}\n\n/**\n * Get or create the global router instance\n */\nexport function getInstalledFarmSPARouter(): SPARouter | undefined {\n  if (typeof window === \"undefined\") return undefined;\n  return (window as Window & { __FARM_SPA_ROUTER__?: SPARouter }).__FARM_SPA_ROUTER__;\n}\n\nexport function getRouter(): SPARouter {\n  if (typeof window === \"undefined\") {\n    // Return a no-op router for SSR\n    return new SPARouter();\n  }\n\n  const installedRouter = getInstalledFarmSPARouter();\n  if (installedRouter) {\n    routerInstance = installedRouter;\n    return installedRouter;\n  }\n\n  if (!routerInstance) {\n    routerInstance = new SPARouter();\n  }\n\n  return routerInstance;\n}\n\n/**\n * Navigate to a URL using the SPA router\n */\nexport function navigateTo(href: string, options?: FarmNavigateOptions): Promise<void> {\n  return getRouter().navigate(href, options);\n}\n\n/**\n * Prefetch a URL\n */\nexport function prefetch(href: string): Promise<void> {\n  return getRouter().prefetch(href);\n}\n\nexport function pushState(state: unknown, href?: string): void {\n  getRouter().pushState(state, href);\n}\n\nexport function replaceState(state: unknown, href?: string): void {\n  getRouter().replaceState(state, href);\n}\n\nexport function readPageState<TState = unknown>(): TState | null {\n  if (typeof window === \"undefined\") return null;\n  const state = window.history.state;\n  if (!state || typeof state !== \"object\") return null;\n  return ((state as Record<string, unknown>)[FARM_PAGE_STATE_KEY] as TState | undefined) ?? null;\n}\n\nfunction createHistoryState(\n  path: string,\n  pageState: unknown,\n  currentState?: unknown,\n  interceptFrom?: string | null,\n) {\n  const base =\n    currentState && typeof currentState === \"object\" ? { ...(currentState as object) } : {};\n  const nextState: Record<string, unknown> = {\n    ...base,\n    path,\n    [FARM_PAGE_STATE_KEY]: pageState,\n  };\n  if (interceptFrom === null) {\n    delete nextState[FARM_INTERCEPT_FROM_KEY];\n  } else if (interceptFrom) {\n    nextState[FARM_INTERCEPT_FROM_KEY] = interceptFrom;\n  }\n  return nextState;\n}\n\nfunction getPageDataCacheKey(path: string, interceptFrom?: string): string {\n  return interceptFrom ? `${path}\\nintercept:${interceptFrom}` : path;\n}\n\nfunction createNavigationLocation(url: URL): FarmNavigationLocation {\n  return {\n    href: url.href,\n    pathname: url.pathname,\n    search: url.search,\n    hash: url.hash,\n  };\n}\n\nfunction getScrollElementStorageKey(path: string, key: string): string {\n  return `farm-scroll-${path}:${key}`;\n}\n","import {\n  context,\n  createContextKey,\n  isSpanContextValid,\n  propagation,\n  SpanKind,\n  SpanStatusCode,\n  trace,\n  type Attributes,\n  type Context,\n  type Span,\n} from \"@opentelemetry/api\";\nimport type { FarmEvent } from \"./observability\";\n\nexport const FARM_TRACER_NAME = \"@farm.js/core\";\n\nexport type FarmTraceSpanKind =\n  | \"request\"\n  | \"render\"\n  | \"middleware\"\n  | \"api\"\n  | \"integration\"\n  | \"storage\"\n  | \"ppr\"\n  | \"build\"\n  | \"plugin\";\n\nexport interface FarmTracingConfig {\n  /** Enable Farm's OpenTelemetry spans. */\n  enabled?: boolean;\n  /** Span families to record. All families are enabled by default. */\n  spans?: readonly FarmTraceSpanKind[];\n  /** Add Farm lifecycle events to the active span. Defaults to true. */\n  recordEvents?: boolean;\n  /** Static attributes added to every Farm-created span. */\n  attributes?: Attributes;\n  /** Path prefixes that should not create request spans. */\n  ignorePaths?: readonly string[];\n}\n\nexport type FarmTracingUserConfig = boolean | FarmTracingConfig;\n\nexport interface FarmResolvedTracingConfig {\n  enabled: boolean;\n  spans: ReadonlySet<FarmTraceSpanKind>;\n  recordEvents: boolean;\n  attributes: Attributes;\n  ignorePaths: readonly string[];\n}\n\nexport interface FarmTraceContext {\n  traceId: string;\n  spanId: string;\n  traceSampled: boolean;\n}\n\nexport interface FarmRequestSpanOptions {\n  getStatusCode?: () => number | undefined;\n  onStart?: () => void;\n  onComplete?: (status: number, durationMs: number) => void;\n  onError?: (error: unknown, durationMs: number) => void;\n}\n\nexport interface FarmSpanOptions {\n  kind?: FarmTraceSpanKind;\n  attributes?: Attributes;\n  spanKind?: SpanKind;\n}\n\nconst ALL_SPAN_KINDS: readonly FarmTraceSpanKind[] = [\n  \"request\",\n  \"render\",\n  \"middleware\",\n  \"api\",\n  \"integration\",\n  \"storage\",\n  \"ppr\",\n  \"build\",\n  \"plugin\",\n];\n\nconst DEFAULT_IGNORED_PATHS = [\n  \"/@vite/\",\n  \"/@fs/\",\n  \"/@id/\",\n  \"/@react-refresh\",\n  \"/node_modules/\",\n  \"/__vite\",\n  \"/.well-known/appspecific/\",\n];\nconst FARM_REQUEST_METHOD_CONTEXT_KEY = createContextKey(\"@farm.js/core/request-method\");\n\nlet tracingState: FarmResolvedTracingConfig = normalizeFarmTracingConfig(false);\n\nexport function normalizeFarmTracingConfig(\n  config: FarmTracingUserConfig | undefined,\n): FarmResolvedTracingConfig {\n  if (!config) {\n    return {\n      enabled: false,\n      spans: new Set(ALL_SPAN_KINDS),\n      recordEvents: true,\n      attributes: {},\n      ignorePaths: DEFAULT_IGNORED_PATHS,\n    };\n  }\n\n  if (config === true) {\n    return {\n      enabled: true,\n      spans: new Set(ALL_SPAN_KINDS),\n      recordEvents: true,\n      attributes: {},\n      ignorePaths: DEFAULT_IGNORED_PATHS,\n    };\n  }\n\n  return {\n    enabled: config.enabled ?? true,\n    spans: new Set(config.spans ?? ALL_SPAN_KINDS),\n    recordEvents: config.recordEvents ?? true,\n    attributes: { ...config.attributes },\n    ignorePaths: [...DEFAULT_IGNORED_PATHS, ...(config.ignorePaths ?? [])],\n  };\n}\n\nexport function configureFarmTracing(\n  config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): void {\n  if (isResolvedFarmTracingConfig(config)) {\n    tracingState = {\n      ...config,\n      spans: new Set(config.spans),\n      attributes: { ...config.attributes },\n      ignorePaths: [...config.ignorePaths],\n    };\n    return;\n  }\n  tracingState = normalizeFarmTracingConfig(config as FarmTracingUserConfig | undefined);\n}\n\nfunction isResolvedFarmTracingConfig(\n  config: FarmTracingUserConfig | FarmResolvedTracingConfig | undefined,\n): config is FarmResolvedTracingConfig {\n  return (\n    !!config &&\n    typeof config === \"object\" &&\n    typeof config.enabled === \"boolean\" &&\n    config.spans instanceof Set &&\n    typeof config.recordEvents === \"boolean\" &&\n    Array.isArray(config.ignorePaths)\n  );\n}\n\nexport function getFarmTracingConfig(): FarmResolvedTracingConfig {\n  return tracingState;\n}\n\nexport function resetFarmTracing(): void {\n  tracingState = normalizeFarmTracingConfig(false);\n}\n\nexport function getFarmTraceContext(): FarmTraceContext | undefined {\n  return getSpanTraceContext(trace.getSpan(context.active()));\n}\n\nexport async function runWithFarmSpan<T>(\n  name: string,\n  handler: () => T | Promise<T>,\n  options: FarmSpanOptions = {},\n): Promise<T> {\n  const spanFamily = options.kind;\n  if (!tracingState.enabled || (spanFamily !== undefined && !tracingState.spans.has(spanFamily))) {\n    return await handler();\n  }\n\n  const tracer = trace.getTracer(FARM_TRACER_NAME);\n  return await tracer.startActiveSpan(\n    name,\n    {\n      kind: options.spanKind ?? SpanKind.INTERNAL,\n      attributes: {\n        ...tracingState.attributes,\n        ...options.attributes,\n      },\n    },\n    async (span) => {\n      try {\n        return await handler();\n      } catch (error) {\n        recordSpanError(span, error);\n        throw error;\n      } finally {\n        span.end();\n      }\n    },\n  );\n}\n\nexport async function _runWithFarmRequestSpan<T>(\n  request: Request,\n  handler: () => T | Promise<T>,\n  options: FarmRequestSpanOptions = {},\n): Promise<T> {\n  const startedAt = Date.now();\n  const url = new URL(request.url);\n  const shouldTrace =\n    tracingState.enabled &&\n    tracingState.spans.has(\"request\") &&\n    !tracingState.ignorePaths.some((prefix) => url.pathname.startsWith(prefix));\n\n  if (!shouldTrace) {\n    options.onStart?.();\n    try {\n      const result = await handler();\n      options.onComplete?.(resolveResultStatus(result, options), Date.now() - startedAt);\n      return result;\n    } catch (error) {\n      options.onError?.(error, Date.now() - startedAt);\n      throw error;\n    }\n  }\n\n  const extractedContext = propagation.extract(context.active(), request.headers, {\n    keys(carrier) {\n      return Array.from(carrier.keys());\n    },\n    get(carrier, key) {\n      return carrier.get(key) ?? undefined;\n    },\n  });\n  const requestContext = extractedContext.setValue(FARM_REQUEST_METHOD_CONTEXT_KEY, request.method);\n  const tracer = trace.getTracer(FARM_TRACER_NAME);\n  const attributes: Attributes = {\n    ...tracingState.attributes,\n    \"http.request.method\": request.method,\n    \"url.path\": url.pathname,\n    \"url.scheme\": url.protocol.replace(/:$/, \"\"),\n    \"server.address\": url.hostname,\n  };\n  if (url.port) attributes[\"server.port\"] = Number(url.port);\n\n  return await tracer.startActiveSpan(\n    `${request.method} ${url.pathname}`,\n    { kind: SpanKind.SERVER, attributes },\n    requestContext,\n    async (span) => {\n      options.onStart?.();\n      try {\n        const result = await handler();\n        const status = resolveResultStatus(result, options);\n        setResponseStatus(span, status);\n        options.onComplete?.(status, Date.now() - startedAt);\n        return result;\n      } catch (error) {\n        recordSpanError(span, error);\n        options.onError?.(error, Date.now() - startedAt);\n        throw error;\n      } finally {\n        span.end();\n      }\n    },\n  );\n}\n\nexport function recordFarmEventTrace(event: FarmEvent): FarmTraceContext | undefined {\n  if (!tracingState.enabled) return undefined;\n\n  const activeContext = context.active();\n  const activeSpan = trace.getSpan(activeContext);\n  const traceContext = getSpanTraceContext(activeSpan);\n  if (activeSpan && traceContext) {\n    if (event.type === \"route.matched\") {\n      const method =\n        (activeContext.getValue(FARM_REQUEST_METHOD_CONTEXT_KEY) as string | undefined) ?? \"HTTP\";\n      activeSpan.updateName(`${method} ${event.route}`);\n      activeSpan.setAttribute(\"http.route\", event.route);\n      activeSpan.setAttribute(\"farm.route\", event.route);\n    }\n\n    if (tracingState.recordEvents) {\n      activeSpan.addEvent(event.type, toEventAttributes(event), event.timestamp);\n    }\n\n    const error = event.type === \"request.error\" ? undefined : getEventError(event);\n    if (error !== undefined) {\n      // A recoverable render error (caught by an error boundary) still fires\n      // React's onError while the request returns a valid response, so record\n      // the exception for visibility but let the actual response status\n      // (setResponseStatus) decide the span status instead of forcing the whole\n      // request trace to ERROR. A genuinely fatal render error surfaces through\n      // the request outcome (a thrown handler or a >= 500 status) and is marked\n      // there.\n      if (event.type === \"render.error\") {\n        recordSpanException(activeSpan, error);\n      } else {\n        recordSpanError(activeSpan, error);\n      }\n    }\n  }\n\n  const completedTraceContext = recordCompletedEventSpan(event, activeContext);\n  return traceContext ?? completedTraceContext;\n}\n\nfunction recordCompletedEventSpan(\n  event: FarmEvent,\n  parentContext: Context,\n): FarmTraceContext | undefined {\n  const descriptor = getCompletedSpanDescriptor(event);\n  if (!descriptor || !tracingState.spans.has(descriptor.kind)) return undefined;\n\n  const tracer = trace.getTracer(FARM_TRACER_NAME);\n  const span = tracer.startSpan(\n    descriptor.name,\n    {\n      kind: SpanKind.INTERNAL,\n      startTime: event.timestamp - descriptor.durationMs,\n      attributes: {\n        ...tracingState.attributes,\n        ...toEventAttributes(event),\n        \"farm.event.type\": event.type,\n      },\n    },\n    parentContext,\n  );\n\n  const status = \"status\" in event && typeof event.status === \"number\" ? event.status : undefined;\n  if (status !== undefined) setResponseStatus(span, status);\n  const error = getEventError(event);\n  if (error !== undefined) recordSpanError(span, error);\n  const traceContext = getSpanTraceContext(span);\n  span.end(event.timestamp);\n  return traceContext;\n}\n\nfunction getCompletedSpanDescriptor(\n  event: FarmEvent,\n): { kind: FarmTraceSpanKind; name: string; durationMs: number } | undefined {\n  if (!(\"durationMs\" in event) || typeof event.durationMs !== \"number\") return undefined;\n\n  switch (event.type) {\n    case \"render.complete\":\n      return { kind: \"render\", name: `farm.render ${event.route}`, durationMs: event.durationMs };\n    case \"render.stream.shellReady\":\n      return {\n        kind: \"render\",\n        name: `farm.render.shell ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"render.stream.complete\":\n      return {\n        kind: \"render\",\n        name: `farm.render.stream ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"middleware.complete\":\n      return {\n        kind: \"middleware\",\n        name: `farm.middleware ${event.name ?? event.route ?? \"anonymous\"}`,\n        durationMs: event.durationMs,\n      };\n    case \"api.request.complete\":\n    case \"api.error\":\n      return {\n        kind: \"api\",\n        name: `farm.api ${event.method} ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"integration.api.call.complete\":\n      return {\n        kind: \"integration\",\n        name: `farm.integration ${event.integration}.${event.operation}`,\n        durationMs: event.durationMs,\n      };\n    case \"storage.query.complete\":\n      return {\n        kind: \"storage\",\n        name: `farm.storage ${event.operation}`,\n        durationMs: event.durationMs,\n      };\n    case \"ppr.refresh.complete\":\n      return {\n        kind: \"ppr\",\n        name: `farm.ppr.refresh ${event.route}`,\n        durationMs: event.durationMs,\n      };\n    case \"build.complete\":\n      return {\n        kind: \"build\",\n        name: `farm.build${event.target ? ` ${event.target}` : \"\"}`,\n        durationMs: event.durationMs,\n      };\n    case \"plugin.hook.complete\":\n      return {\n        kind: \"plugin\",\n        name: `farm.plugin ${event.plugin}.${event.hook}`,\n        durationMs: event.durationMs,\n      };\n    default:\n      return undefined;\n  }\n}\n\n// A runtime-agnostic, non-cryptographic digest (FNV-1a). This module is bundled\n// into browser and edge runtimes, so it must not import node:crypto; the digest\n// only needs to redact the raw cache key while keeping cache events correlatable,\n// which does not require a cryptographic hash.\nfunction hashFarmCacheKey(value: string): string {\n  let hash = 0x811c9dc5;\n  for (let index = 0; index < value.length; index++) {\n    hash ^= value.charCodeAt(index);\n    hash = Math.imul(hash, 0x01000193);\n  }\n  return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\nfunction toEventAttributes(event: FarmEvent): Attributes {\n  const attributes: Attributes = {};\n  // A cache event's `key` embeds the serialized arguments of the cached call\n  // (e.g. `unstable_cache(getUser)(email)` serializes the email into the key),\n  // so it must never be exported verbatim to a tracing backend. Emit a stable\n  // digest under `farm.key_hash` instead, preserving cross-event correlation\n  // without shipping the sensitive payload.\n  const redactKey = typeof event.type === \"string\" && event.type.startsWith(\"cache.\");\n  for (const [key, value] of Object.entries(event)) {\n    if (\n      key === \"timestamp\" ||\n      key === \"level\" ||\n      key === \"error\" ||\n      key === \"traceId\" ||\n      key === \"spanId\" ||\n      key === \"traceSampled\" ||\n      value === undefined\n    ) {\n      continue;\n    }\n    if (redactKey && key === \"key\" && typeof value === \"string\") {\n      attributes[\"farm.key_hash\"] = hashFarmCacheKey(value);\n      continue;\n    }\n    if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n      attributes[`farm.${key}`] = value;\n    } else if (Array.isArray(value)) {\n      if (value.every((entry) => typeof entry === \"string\")) {\n        attributes[`farm.${key}`] = value as string[];\n      } else if (value.every((entry) => typeof entry === \"number\")) {\n        attributes[`farm.${key}`] = value as number[];\n      } else if (value.every((entry) => typeof entry === \"boolean\")) {\n        attributes[`farm.${key}`] = value as boolean[];\n      }\n    }\n  }\n  return attributes;\n}\n\nfunction getEventError(event: FarmEvent): unknown {\n  return \"error\" in event ? event.error : undefined;\n}\n\nfunction recordSpanException(span: Span, error: unknown): Error {\n  const normalized = error instanceof Error ? error : new Error(String(error));\n  span.recordException(normalized);\n  return normalized;\n}\n\nfunction recordSpanError(span: Span, error: unknown): void {\n  const normalized = recordSpanException(span, error);\n  span.setStatus({ code: SpanStatusCode.ERROR, message: normalized.message });\n}\n\nfunction setResponseStatus(span: Span, status: number): void {\n  span.setAttribute(\"http.response.status_code\", status);\n  if (status >= 500) {\n    span.setStatus({ code: SpanStatusCode.ERROR });\n  }\n}\n\nfunction resolveResultStatus<T>(result: T, options: FarmRequestSpanOptions): number {\n  if (result instanceof Response) return result.status;\n  return options.getStatusCode?.() ?? 200;\n}\n\nfunction getSpanTraceContext(span: Span | undefined): FarmTraceContext | undefined {\n  if (!span) return undefined;\n  const spanContext = span.spanContext();\n  if (!isSpanContextValid(spanContext)) return undefined;\n  return {\n    traceId: spanContext.traceId,\n    spanId: spanContext.spanId,\n    traceSampled: (spanContext.traceFlags & 0x01) === 0x01,\n  };\n}\n","import {\n  _runWithFarmRequestSpan,\n  configureFarmTracing,\n  getFarmTraceContext,\n  normalizeFarmTracingConfig,\n  recordFarmEventTrace,\n  resetFarmTracing,\n  runWithFarmSpan,\n  type FarmRequestSpanOptions,\n  type FarmResolvedTracingConfig,\n  type FarmSpanOptions,\n  type FarmTraceContext,\n  type FarmTraceSpanKind,\n  type FarmTracingConfig,\n  type FarmTracingUserConfig,\n} from \"./tracing\";\n\nexport type FarmEventLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface FarmEventBase {\n  type: string;\n  timestamp: number;\n  level: FarmEventLevel;\n  requestId?: string;\n  traceId?: string;\n  spanId?: string;\n  traceSampled?: boolean;\n  route?: string;\n  pathname?: string;\n}\n\nexport type FarmRequestEvent =\n  | (FarmEventBase & { type: \"request.start\"; method: string; pathname: string })\n  | (FarmEventBase & {\n      type: \"request.complete\";\n      method: string;\n      pathname: string;\n      status: number;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"request.error\";\n      method: string;\n      pathname: string;\n      durationMs: number;\n      error: unknown;\n    });\n\nexport type FarmServerEvent =\n  | (FarmEventBase & {\n      type: \"server.start\";\n      mode: \"dev\" | \"preview\" | \"production\";\n      port?: number;\n    })\n  | (FarmEventBase & { type: \"server.ready\"; url?: string })\n  | (FarmEventBase & { type: \"server.shutdown\"; reason?: string });\n\nexport type FarmRouteEvent =\n  | (FarmEventBase & { type: \"route.discovered\"; route: string; filePath: string })\n  | (FarmEventBase & {\n      type: \"route.matched\";\n      pathname: string;\n      route: string;\n      params?: Record<string, string>;\n    })\n  | (FarmEventBase & { type: \"route.notFound\"; pathname: string })\n  | (FarmEventBase & { type: \"route.redirect\"; from: string; to: string; status?: number })\n  | (FarmEventBase & { type: \"route.rewrite\"; from: string; to: string });\n\nexport type FarmRenderEvent =\n  | (FarmEventBase & { type: \"render.start\"; route: string; pathname?: string })\n  | (FarmEventBase & {\n      type: \"render.complete\";\n      route: string;\n      durationMs: number;\n      status?: number;\n    })\n  | (FarmEventBase & { type: \"render.error\"; route?: string; error: unknown })\n  | (FarmEventBase & { type: \"render.stream.start\"; route: string })\n  | (FarmEventBase & { type: \"render.stream.shellReady\"; route: string; durationMs: number })\n  | (FarmEventBase & { type: \"render.stream.complete\"; route: string; durationMs: number });\n\nexport type FarmCacheEvent =\n  | (FarmEventBase & {\n      type: \"cache.hit\";\n      key: string;\n      route?: string;\n      tags?: readonly string[];\n      revalidate?: number | false;\n      stale?: boolean;\n    })\n  | (FarmEventBase & { type: \"cache.miss\"; key: string; route?: string; reason?: string })\n  | (FarmEventBase & {\n      type: \"cache.set\";\n      key: string;\n      route?: string;\n      tags?: readonly string[];\n      revalidate?: number | false;\n    })\n  | (FarmEventBase & { type: \"cache.dedupe\"; key: string })\n  | (FarmEventBase & { type: \"cache.bypass\"; key?: string; route?: string; reason: string })\n  | (FarmEventBase & {\n      type: \"cache.stale\";\n      key: string;\n      route?: string;\n      tags?: readonly string[];\n      revalidate?: number | false;\n    })\n  | (FarmEventBase & { type: \"cache.revalidatePath\"; path: string; count: number })\n  | (FarmEventBase & {\n      type: \"cache.revalidateTag\";\n      tag: string;\n      profile?: unknown;\n      count: number;\n    })\n  | (FarmEventBase & { type: \"cache.updateTag\"; tag: string; count: number })\n  | (FarmEventBase & {\n      type: \"cache.invalidated\";\n      key?: string;\n      route?: string;\n      tag?: string;\n      reason?: string;\n      count?: number;\n    })\n  | (FarmEventBase & { type: \"cache.delete\"; key: string; deleted: boolean })\n  | (FarmEventBase & { type: \"cache.clear\"; count: number })\n  | (FarmEventBase & {\n      type: \"cache.error\";\n      key?: string;\n      operation: \"get\" | \"set\" | \"delete\" | \"revalidate\";\n      error: unknown;\n    });\n\nexport type FarmPPREvent =\n  | (FarmEventBase & { type: \"ppr.shell.hit\"; route: string; key: string })\n  | (FarmEventBase & { type: \"ppr.shell.miss\"; route: string; key: string })\n  | (FarmEventBase & {\n      type: \"ppr.shell.cached\";\n      route: string;\n      key: string;\n      revalidate?: number;\n    })\n  | (FarmEventBase & { type: \"ppr.shell.bypass\"; route: string; reason: string })\n  | (FarmEventBase & {\n      type: \"ppr.shell.invalidated\";\n      route: string;\n      reason?: string;\n      count?: number;\n    })\n  | (FarmEventBase & { type: \"ppr.suspense.holeDetected\"; route: string })\n  | (FarmEventBase & { type: \"ppr.refresh.start\"; route: string })\n  | (FarmEventBase & { type: \"ppr.refresh.complete\"; route: string; durationMs: number })\n  | (FarmEventBase & { type: \"ppr.refresh.error\"; route: string; error: unknown });\n\nexport type FarmAPIEvent =\n  | (FarmEventBase & { type: \"api.request.start\"; route: string; method: string })\n  | (FarmEventBase & {\n      type: \"api.request.complete\";\n      route: string;\n      method: string;\n      status: number;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"api.validation.failed\";\n      route: string;\n      method: string;\n      issues?: unknown;\n    })\n  | (FarmEventBase & {\n      type: \"api.error\";\n      route: string;\n      method: string;\n      durationMs: number;\n      error: unknown;\n    });\n\nexport type FarmIntegrationEvent =\n  | (FarmEventBase & { type: \"integration.registered\"; name: string })\n  | (FarmEventBase & { type: \"integration.config.validated\"; name: string })\n  | (FarmEventBase & { type: \"integration.ready\"; name: string })\n  | (FarmEventBase & { type: \"integration.disposed\"; name: string })\n  | (FarmEventBase & {\n      type: \"integration.api.call.start\";\n      integration: string;\n      operation: string;\n    })\n  | (FarmEventBase & {\n      type: \"integration.api.call.complete\";\n      integration: string;\n      operation: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"integration.api.call.error\";\n      integration: string;\n      operation: string;\n      error: unknown;\n    })\n  | (FarmEventBase & { type: \"integration.webhook.received\"; integration: string; event?: string })\n  | (FarmEventBase & { type: \"integration.webhook.verified\"; integration: string; event?: string })\n  | (FarmEventBase & { type: \"integration.webhook.failed\"; integration: string; reason: string });\n\nexport type FarmMiddlewareEvent =\n  | (FarmEventBase & { type: \"middleware.start\"; route?: string; name?: string })\n  | (FarmEventBase & {\n      type: \"middleware.complete\";\n      route?: string;\n      name?: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"middleware.shortCircuit\";\n      route?: string;\n      name?: string;\n      status?: number;\n    })\n  | (FarmEventBase & { type: \"middleware.error\"; route?: string; name?: string; error: unknown });\n\nexport type FarmStorageEvent =\n  | (FarmEventBase & { type: \"storage.query.start\"; integration?: string; operation: string })\n  | (FarmEventBase & {\n      type: \"storage.query.complete\";\n      integration?: string;\n      operation: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & {\n      type: \"storage.query.error\";\n      integration?: string;\n      operation: string;\n      error: unknown;\n    })\n  | (FarmEventBase & { type: \"storage.schema.ready\"; integration?: string })\n  | (FarmEventBase & { type: \"storage.schema.error\"; integration?: string; error: unknown });\n\nexport type FarmBuildEvent =\n  | (FarmEventBase & { type: \"build.start\"; target?: string })\n  | (FarmEventBase & { type: \"build.complete\"; target?: string; durationMs: number })\n  | (FarmEventBase & { type: \"build.error\"; target?: string; error: unknown })\n  | (FarmEventBase & { type: \"routes.generated\"; pageCount: number; apiCount?: number })\n  | (FarmEventBase & { type: \"types.generated\"; filePath: string })\n  | (FarmEventBase & { type: \"manifest.generated\"; routeCount: number });\n\nexport type FarmPluginEvent =\n  | (FarmEventBase & { type: \"plugin.hook.start\"; plugin: string; hook: string })\n  | (FarmEventBase & {\n      type: \"plugin.hook.complete\";\n      plugin: string;\n      hook: string;\n      durationMs: number;\n    })\n  | (FarmEventBase & { type: \"plugin.hook.error\"; plugin: string; hook: string; error: unknown });\n\nexport type FarmErrorEvent = FarmEventBase & {\n  type: \"error\";\n  source: string;\n  error: unknown;\n  route?: string;\n};\n\nexport type FarmEvent =\n  | FarmRequestEvent\n  | FarmServerEvent\n  | FarmRouteEvent\n  | FarmRenderEvent\n  | FarmCacheEvent\n  | FarmPPREvent\n  | FarmAPIEvent\n  | FarmIntegrationEvent\n  | FarmMiddlewareEvent\n  | FarmStorageEvent\n  | FarmBuildEvent\n  | FarmPluginEvent\n  | FarmErrorEvent;\n\nexport type FarmEventType = FarmEvent[\"type\"];\nexport type FarmEventHandler = (event: FarmEvent) => void | Promise<void>;\n\nexport type FarmEventInput = FarmEvent extends infer T\n  ? T extends FarmEvent\n    ? Omit<T, \"timestamp\" | \"level\"> & Partial<Pick<T, \"timestamp\" | \"level\">>\n    : never\n  : never;\n\nexport type FarmObservabilityUserConfig =\n  | boolean\n  | {\n      logs?: boolean;\n      onEvent?: FarmEventHandler | readonly FarmEventHandler[];\n      events?: readonly FarmEventType[];\n      tracing?: FarmTracingUserConfig;\n    };\n\nexport interface FarmResolvedObservabilityConfig {\n  logs: boolean;\n  handlers: FarmEventHandler[];\n  events?: Set<FarmEventType>;\n  tracing: FarmResolvedTracingConfig;\n}\n\nexport interface FarmEventSubscriptionOptions {\n  /** Receive events even when they are excluded by `observability.events`. */\n  unfiltered?: boolean;\n}\n\nconst runtimeHandlers = new Set<FarmEventHandler>();\nconst unfilteredRuntimeHandlers = new Set<FarmEventHandler>();\nlet observabilityState: FarmResolvedObservabilityConfig = {\n  logs: false,\n  handlers: [],\n  tracing: normalizeFarmTracingConfig(false),\n};\n\nexport function configureFarmObservability(config: FarmObservabilityUserConfig | undefined): void {\n  observabilityState = normalizeFarmObservabilityConfig(config);\n  configureFarmTracing(observabilityState.tracing);\n}\n\nexport function normalizeFarmObservabilityConfig(\n  config: FarmObservabilityUserConfig | undefined,\n): FarmResolvedObservabilityConfig {\n  if (config === undefined || config === false) {\n    return { logs: false, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n  }\n\n  if (config === true) {\n    return { logs: true, handlers: [], tracing: normalizeFarmTracingConfig(false) };\n  }\n\n  const handlers = config.onEvent\n    ? Array.isArray(config.onEvent)\n      ? [...config.onEvent]\n      : [config.onEvent]\n    : [];\n\n  return {\n    logs: config.logs ?? false,\n    handlers,\n    events: config.events ? new Set(config.events) : undefined,\n    tracing: normalizeFarmTracingConfig(config.tracing),\n  };\n}\n\nexport function onFarmEvent(\n  handler: FarmEventHandler,\n  options: FarmEventSubscriptionOptions = {},\n): () => void {\n  const handlers = options.unfiltered ? unfilteredRuntimeHandlers : runtimeHandlers;\n  handlers.add(handler);\n  return () => {\n    handlers.delete(handler);\n  };\n}\n\nexport function resetFarmObservability(): void {\n  runtimeHandlers.clear();\n  unfilteredRuntimeHandlers.clear();\n  observabilityState = {\n    logs: false,\n    handlers: [],\n    tracing: normalizeFarmTracingConfig(false),\n  };\n  resetFarmTracing();\n}\n\nexport function emitFarmEvent(input: FarmEventInput): FarmEvent {\n  const event = {\n    timestamp: Date.now(),\n    level: inferFarmEventLevel(input.type),\n    ...input,\n  } as FarmEvent;\n\n  const traceContext = recordFarmEventTrace(event);\n  if (traceContext) {\n    event.traceId = traceContext.traceId;\n    event.spanId = traceContext.spanId;\n    event.traceSampled = traceContext.traceSampled;\n  }\n\n  notifyFarmEventHandlers(event, unfilteredRuntimeHandlers);\n\n  if (!shouldEmitFarmEvent(event)) return event;\n\n  if (observabilityState.logs) {\n    logFarmEvent(event);\n  }\n\n  notifyFarmEventHandlers(event, [...observabilityState.handlers, ...runtimeHandlers]);\n\n  return event;\n}\n\nfunction notifyFarmEventHandlers(event: FarmEvent, handlers: Iterable<FarmEventHandler>): void {\n  for (const handler of handlers) {\n    try {\n      Promise.resolve(handler(event)).catch((error) => {\n        console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n      });\n    } catch (error) {\n      console.warn(`[farm:observability] event handler failed: ${formatError(error)}`);\n    }\n  }\n}\n\nexport async function runWithFarmRequestSpan<T>(\n  request: Request,\n  handler: () => T | Promise<T>,\n  options: FarmRequestSpanOptions = {},\n): Promise<T> {\n  const url = new URL(request.url);\n  const method = request.method || \"GET\";\n  return await _runWithFarmRequestSpan(request, handler, {\n    ...options,\n    onStart() {\n      emitFarmEvent({ type: \"request.start\", method, pathname: url.pathname });\n      options.onStart?.();\n    },\n    onComplete(status, durationMs) {\n      emitFarmEvent({\n        type: \"request.complete\",\n        method,\n        pathname: url.pathname,\n        status,\n        durationMs,\n      });\n      options.onComplete?.(status, durationMs);\n    },\n    onError(error, durationMs) {\n      emitFarmEvent({\n        type: \"request.error\",\n        method,\n        pathname: url.pathname,\n        durationMs,\n        error,\n      });\n      options.onError?.(error, durationMs);\n    },\n  });\n}\n\nexport { configureFarmTracing, getFarmTraceContext, normalizeFarmTracingConfig, runWithFarmSpan };\nexport type {\n  FarmRequestSpanOptions,\n  FarmResolvedTracingConfig,\n  FarmSpanOptions,\n  FarmTraceContext,\n  FarmTraceSpanKind,\n  FarmTracingConfig,\n  FarmTracingUserConfig,\n};\n\nfunction shouldEmitFarmEvent(event: FarmEvent): boolean {\n  if (\n    !observabilityState.logs &&\n    observabilityState.handlers.length === 0 &&\n    runtimeHandlers.size === 0\n  ) {\n    return false;\n  }\n\n  if (observabilityState.events && !observabilityState.events.has(event.type)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction inferFarmEventLevel(type: FarmEventType): FarmEventLevel {\n  if (type === \"error\" || type.endsWith(\".error\") || type.endsWith(\".failed\")) {\n    return \"error\";\n  }\n  if (\n    type.endsWith(\".bypass\") ||\n    type.endsWith(\".invalidated\") ||\n    type.endsWith(\".stale\") ||\n    type.endsWith(\".notFound\")\n  ) {\n    return \"warn\";\n  }\n  if (\n    type.endsWith(\".hit\") ||\n    type.endsWith(\".miss\") ||\n    type.endsWith(\".start\") ||\n    type.endsWith(\".shellReady\")\n  ) {\n    return \"debug\";\n  }\n  return \"info\";\n}\n\nfunction logFarmEvent(event: FarmEvent): void {\n  const message = `[farm:${event.level}] ${event.type}${formatFarmEventDetails(event)}`;\n  switch (event.level) {\n    case \"error\":\n      console.error(message);\n      break;\n    case \"warn\":\n      console.warn(message);\n      break;\n    default:\n      console.log(message);\n      break;\n  }\n}\n\nfunction formatFarmEventDetails(event: FarmEvent): string {\n  const details: string[] = [];\n  const record = event as unknown as Record<string, unknown>;\n\n  for (const key of [\n    \"route\",\n    \"pathname\",\n    \"method\",\n    \"status\",\n    \"key\",\n    \"tag\",\n    \"path\",\n    \"reason\",\n    \"durationMs\",\n    \"integration\",\n    \"operation\",\n    \"plugin\",\n    \"hook\",\n    \"target\",\n    \"count\",\n  ]) {\n    const value = record[key];\n    if (value !== undefined) {\n      details.push(`${key}=${formatDetailValue(value)}`);\n    }\n  }\n\n  return details.length > 0 ? ` ${details.join(\" \")}` : \"\";\n}\n\nfunction formatDetailValue(value: unknown): string {\n  if (typeof value === \"string\") {\n    return value;\n  }\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return String(value);\n  }\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return String(value);\n  }\n}\n\nfunction formatError(error: unknown): string {\n  return error instanceof Error ? error.message : String(error);\n}\n","export type FarmCacheInvalidationListener = (key: string) => void;\nexport type FarmCacheTaskListener = (task: Promise<void>) => void;\n\nexport const FARM_CACHE_INVALIDATION_HEADER = \"x-farm-cache-invalidations\";\n\ntype FarmCacheInvalidationState = {\n  listeners: Set<FarmCacheInvalidationListener>;\n  taskListeners: Set<FarmCacheTaskListener>;\n};\n\nconst FARM_CACHE_INVALIDATION_STATE = Symbol.for(\"farm.cacheInvalidationState\");\nconst globalState = globalThis as typeof globalThis & {\n  [FARM_CACHE_INVALIDATION_STATE]?: FarmCacheInvalidationState;\n};\n\nfunction getFarmCacheInvalidationState(): FarmCacheInvalidationState {\n  return (globalState[FARM_CACHE_INVALIDATION_STATE] ??= {\n    listeners: new Set(),\n    taskListeners: new Set(),\n  });\n}\n\nfunction warnFarmCacheListenerError(scope: string, error: unknown): void {\n  const detail = error instanceof Error ? (error.stack ?? error.message) : String(error);\n  console.warn(`[farm:cache] ${scope} listener failed: ${detail}`);\n}\n\nexport function notifyFarmCacheInvalidation(key: string): void {\n  if (typeof key !== \"string\" || key.length === 0) return;\n\n  for (const listener of getFarmCacheInvalidationState().listeners) {\n    // Isolate listeners: one throwing observer must not abort the remaining\n    // listeners (or the rest of a multi-key batch in applyFarmCacheInvalidations)\n    // and must not surface as a 500 when invalidation runs inside a request.\n    try {\n      listener(key);\n    } catch (error) {\n      warnFarmCacheListenerError(\"invalidation\", error);\n    }\n  }\n}\n\nexport function notifyFarmCacheTask(task: Promise<void>): void {\n  for (const listener of getFarmCacheInvalidationState().taskListeners) {\n    try {\n      listener(task);\n    } catch (error) {\n      warnFarmCacheListenerError(\"task\", error);\n    }\n  }\n}\n\nexport function applyFarmCacheInvalidations(keys: unknown): void {\n  if (!Array.isArray(keys)) return;\n\n  for (const key of keys) {\n    if (typeof key === \"string\") {\n      notifyFarmCacheInvalidation(key);\n    }\n  }\n}\n\nexport function encodeFarmCacheInvalidations(keys: readonly string[]): string | null {\n  const normalized = Array.from(\n    new Set(keys.filter((key) => typeof key === \"string\" && key.length > 0)),\n  );\n  if (normalized.length === 0) return null;\n  return encodeURIComponent(JSON.stringify(normalized));\n}\n\nexport function decodeFarmCacheInvalidations(value: string | null | undefined): readonly string[] {\n  if (!value) return [];\n\n  try {\n    const parsed = JSON.parse(decodeURIComponent(value));\n    return Array.isArray(parsed)\n      ? Array.from(\n          new Set(parsed.filter((key): key is string => typeof key === \"string\" && key.length > 0)),\n        )\n      : [];\n  } catch {\n    return [];\n  }\n}\n\nexport function subscribeFarmCacheInvalidation(\n  listener: FarmCacheInvalidationListener,\n): () => void {\n  const state = getFarmCacheInvalidationState();\n  state.listeners.add(listener);\n  return () => state.listeners.delete(listener);\n}\n\nexport function subscribeFarmCacheTask(listener: FarmCacheTaskListener): () => void {\n  const state = getFarmCacheInvalidationState();\n  state.taskListeners.add(listener);\n  return () => state.taskListeners.delete(listener);\n}\n","import { emitFarmEvent } from \"./observability\";\nimport { notifyFarmCacheInvalidation, notifyFarmCacheTask } from \"./cache-invalidation\";\nimport { getActiveFarmI18nSnapshot } from \"./i18n/bridge\";\n\nexport { applyFarmCacheInvalidations } from \"./cache-invalidation\";\n\nexport type RevalidateTagProfile =\n  | \"max\"\n  | \"default\"\n  | \"seconds\"\n  | \"minutes\"\n  | \"hours\"\n  | \"days\"\n  | \"weeks\"\n  | \"months\"\n  | { expire?: number };\n\nexport interface FarmCacheOptions {\n  /**\n   * Tag cached data so it can be invalidated with revalidateTag/updateTag.\n   */\n  tags?: readonly string[];\n  /**\n   * Path tags let revalidatePath invalidate data tied to a route.\n   */\n  paths?: readonly string[];\n  /**\n   * Time in seconds before the entry becomes stale. False means no TTL.\n   */\n  revalidate?: number | false;\n}\n\nexport interface FarmCacheSetOptions extends FarmCacheOptions {\n  createdAt?: number;\n}\n\nexport type RouteDataCacheKey = string | readonly unknown[];\n\nexport type FarmCacheInvalidationTarget =\n  | { key: RouteDataCacheKey }\n  | { path: string }\n  | { tag: string };\n\ndeclare const FARM_DEFINED_CACHE_KEY_DATA: unique symbol;\n\n/**\n * A regular Farm cache key carrying the data shape stored under that key.\n *\n * The brand exists only in TypeScript. At runtime the value remains the\n * original string or structured array, so all existing cache APIs continue to\n * accept untyped keys.\n */\nexport type DefinedCacheKey<TData, TKey extends RouteDataCacheKey = RouteDataCacheKey> = TKey & {\n  readonly [FARM_DEFINED_CACHE_KEY_DATA]: TData;\n};\n\nexport type CacheKeyFactory<\n  TData,\n  TArguments extends readonly unknown[],\n  TKey extends RouteDataCacheKey = RouteDataCacheKey,\n> = (...args: TArguments) => DefinedCacheKey<TData, TKey>;\n\nexport type InferCacheKeyData<TKey> =\n  TKey extends DefinedCacheKey<infer TData, RouteDataCacheKey> ? TData : unknown;\n\n/**\n * Optionally add a data type to an existing string/array cache-key factory.\n *\n * This helper does not introduce a new runtime key representation. Calling the\n * returned factory produces the exact key returned by `factory`.\n */\nexport function defineCacheKey<TData>() {\n  return <const TArguments extends readonly unknown[], const TKey extends RouteDataCacheKey>(\n    factory: (...args: TArguments) => TKey,\n  ): CacheKeyFactory<TData, TArguments, TKey> => {\n    if (typeof factory !== \"function\") {\n      throw new TypeError(\"defineCacheKey expects a key factory function.\");\n    }\n\n    return ((...args: TArguments) => {\n      const key = factory(...args);\n      if (typeof key !== \"string\" && !Array.isArray(key)) {\n        throw new TypeError(\n          \"A defined cache key factory must return a string or structured array.\",\n        );\n      }\n      return key as DefinedCacheKey<TData, TKey>;\n    }) as CacheKeyFactory<TData, TArguments, TKey>;\n  };\n}\n\nexport interface FarmCacheEntry<T = unknown> {\n  key: string;\n  value: T;\n  tags: readonly string[];\n  /**\n   * Adapter tag versions captured before the cached value was produced.\n   * A later version makes the entry stale across every server instance.\n   */\n  tagVersions?: Readonly<Record<string, number>>;\n  createdAt: number;\n  createdVersion?: number;\n  revalidate?: number | false;\n}\n\ninterface InternalFarmCacheEntry<T = unknown> {\n  key: string;\n  value: T;\n  tags: Set<string>;\n  tagVersions?: Readonly<Record<string, number>>;\n  createdAt: number;\n  createdVersion: number;\n  revalidate?: number | false;\n}\n\n/**\n * Asynchronous persistence contract used by distributed Farm caches.\n *\n * Implementations are responsible for serializing cache entries and making\n * tag version updates atomic when the backing service supports it.\n */\nexport interface FarmCacheAdapter {\n  readonly name?: string;\n  get<T = unknown>(key: string): Promise<FarmCacheEntry<T> | null | undefined>;\n  set<T = unknown>(key: string, entry: FarmCacheEntry<T>): Promise<void>;\n  delete(key: string): Promise<void>;\n  clear?(): Promise<void>;\n  getTagVersions?(tags: readonly string[]): Promise<Readonly<Record<string, number>>>;\n  invalidateTags?(tags: readonly string[]): Promise<void>;\n  /** Atomically acquire a short-lived regeneration lease. */\n  acquireLease?(key: string, ttlMs: number): Promise<string | null | undefined>;\n  /** Release the lease only when the supplied ownership token still matches. */\n  releaseLease?(key: string, token: string): Promise<void>;\n}\n\nexport interface FarmClientCacheUserConfig {\n  /**\n   * Module path, relative to the project root, whose default export is a\n   * client cache adapter (`defineClientCacheAdapter`). The module is bundled\n   * into the browser entry; the server never imports it.\n   */\n  adapter?: string;\n  /** Extra version salt, typically a build or deploy id; entries persisted under another salt are dropped. */\n  version?: string;\n  /** Debounce for persisted write-behind flushes, in milliseconds. */\n  flushDelayMs?: number;\n}\n\nexport interface FarmCacheUserConfig {\n  /** Shared cache implementation, for example a Redis-backed adapter. */\n  adapter?: FarmCacheAdapter;\n  /** Prefix isolating applications and deployments sharing one adapter. */\n  namespace?: string;\n  /** Browser cache persistence; see the client cache adapter documentation. */\n  client?: FarmClientCacheUserConfig;\n  /**\n   * Coordinate cache fills across processes when the adapter implements\n   * acquireLease/releaseLease. Set false to disable.\n   */\n  lease?:\n    | false\n    | {\n        ttlMs?: number;\n        waitTimeoutMs?: number;\n        pollIntervalMs?: number;\n      };\n}\n\nexport interface FarmCacheStorage {\n  getItem<T = unknown>(key: string): Promise<T | null>;\n  setItem<T = unknown>(key: string, value: T): Promise<unknown>;\n  removeItem(key: string): Promise<unknown>;\n  clear?(base?: string): Promise<unknown>;\n}\n\nexport interface StorageFarmCacheAdapterOptions {\n  /** Prefix used inside the supplied storage client. */\n  base?: string;\n}\n\n/**\n * Adapt a Farm/unstorage-compatible key-value client to the cache contract.\n *\n * This is a portable baseline adapter. Provider-specific adapters should use\n * their atomic increment/transaction primitives for tag invalidation.\n */\nexport function storageCacheAdapter(\n  storage: FarmCacheStorage,\n  options: StorageFarmCacheAdapterOptions = {},\n): FarmCacheAdapter {\n  if (!storage || typeof storage.getItem !== \"function\" || typeof storage.setItem !== \"function\") {\n    throw new TypeError(\"storageCacheAdapter expects a compatible storage client.\");\n  }\n\n  const base = normalizeCacheNamespace(options.base || \"farm-cache\");\n  const entryKey = (key: string) => `${base}:entry:${key}`;\n  const tagKey = (tag: string) => `${base}:tag:${tag}`;\n\n  return {\n    name: \"storage\",\n    get: <T>(key: string) => storage.getItem<FarmCacheEntry<T>>(entryKey(key)),\n    set: async <T>(key: string, entry: FarmCacheEntry<T>) => {\n      await storage.setItem(entryKey(key), entry);\n    },\n    delete: async (key: string) => {\n      await storage.removeItem(entryKey(key));\n    },\n    clear: storage.clear\n      ? async () => {\n          await storage.clear!(base);\n        }\n      : undefined,\n    getTagVersions: async (tags) => {\n      const versions = await Promise.all(\n        tags.map(async (tag) => {\n          const value = await storage.getItem<number>(tagKey(tag));\n          return [tag, normalizeAdapterVersion(value)] as const;\n        }),\n      );\n      return Object.fromEntries(versions);\n    },\n    invalidateTags: async (tags) => {\n      await Promise.all(\n        tags.map(async (tag) => {\n          const key = tagKey(tag);\n          const current = normalizeAdapterVersion(await storage.getItem<number>(key));\n          await storage.setItem(key, Math.max(Date.now(), current + 1));\n        }),\n      );\n    },\n  };\n}\n\nexport interface GetFarmCacheEntryOptions {\n  allowStale?: boolean;\n  now?: number;\n}\n\ninterface FarmCacheStaleEntry {\n  tags: Iterable<string>;\n  createdAt: number;\n  createdVersion?: number;\n  revalidate?: number | false;\n}\n\nexport class FarmDataCache {\n  private entries = new Map<string, InternalFarmCacheEntry>();\n  private inflight = new Map<string, Promise<unknown>>();\n  private invalidatedTagVersions = new Map<string, number>();\n  private version = 0;\n  private generation = 0;\n  private adapter?: FarmCacheAdapter;\n  private namespace = \"farm\";\n  private local = true;\n  private lease = {\n    enabled: true,\n    ttlMs: 10_000,\n    waitTimeoutMs: 10_000,\n    pollIntervalMs: 25,\n  };\n\n  constructor(config: FarmCacheUserConfig = {}) {\n    this.configure(config);\n  }\n\n  configure(config: FarmCacheUserConfig = {}): void {\n    this.generation++;\n    this.entries.clear();\n    this.inflight.clear();\n    this.invalidatedTagVersions.clear();\n    this.version = 0;\n    this.adapter = config.adapter;\n    this.namespace = normalizeCacheNamespace(config.namespace || \"farm\");\n    this.local = !config.adapter;\n    this.lease =\n      config.lease === false\n        ? { ...this.lease, enabled: false }\n        : {\n            enabled: true,\n            ttlMs: normalizePositiveDuration(config.lease?.ttlMs, 10_000, \"cache.lease.ttlMs\"),\n            waitTimeoutMs: normalizePositiveDuration(\n              config.lease?.waitTimeoutMs,\n              10_000,\n              \"cache.lease.waitTimeoutMs\",\n            ),\n            pollIntervalMs: normalizePositiveDuration(\n              config.lease?.pollIntervalMs,\n              25,\n              \"cache.lease.pollIntervalMs\",\n            ),\n          };\n  }\n\n  get adapterName(): string {\n    return this.adapter?.name || (this.adapter ? \"custom\" : \"memory\");\n  }\n\n  get hasAdapter(): boolean {\n    return this.adapter !== undefined;\n  }\n\n  get size(): number {\n    return this.entries.size;\n  }\n\n  get<T>(key: string, options: GetFarmCacheEntryOptions = {}): T | undefined {\n    return this.getEntry<T>(key, options)?.value;\n  }\n\n  getEntry<T = unknown>(\n    key: string,\n    options: GetFarmCacheEntryOptions = {},\n  ): FarmCacheEntry<T> | undefined {\n    const entry = this.entries.get(key) as InternalFarmCacheEntry<T> | undefined;\n    if (!entry) {\n      emitFarmEvent({ type: \"cache.miss\", key });\n      return undefined;\n    }\n\n    const stale = this.isStale(entry, options.now);\n    if (stale) {\n      emitFarmEvent({\n        type: \"cache.stale\",\n        key,\n        tags: Array.from(entry.tags),\n        revalidate: entry.revalidate,\n      });\n    }\n\n    if (!options.allowStale && stale) {\n      emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n      return undefined;\n    }\n\n    emitFarmEvent({\n      type: \"cache.hit\",\n      key,\n      tags: Array.from(entry.tags),\n      revalidate: entry.revalidate,\n      stale,\n    });\n\n    return this.toPublicEntry(entry);\n  }\n\n  async getEntryAsync<T = unknown>(\n    key: string,\n    options: GetFarmCacheEntryOptions = {},\n  ): Promise<FarmCacheEntry<T> | undefined> {\n    if (this.local) {\n      const localEntry = this.getEntry<T>(key, options);\n      if (localEntry) return localEntry;\n    }\n\n    if (!this.adapter) {\n      return this.local ? undefined : this.getEntry<T>(key, options);\n    }\n\n    const generation = this.generation;\n    const adapter = this.adapter;\n    const namespace = this.namespace;\n    const entry = await adapter.get<T>(`${namespace}:entry:${key}`);\n    if (generation !== this.generation) return undefined;\n    if (!entry) {\n      emitFarmEvent({ type: \"cache.miss\", key });\n      return undefined;\n    }\n\n    assertFarmCacheEntry(entry, key);\n    const stale = await this.isAdapterEntryStale(entry, options.now, adapter, namespace);\n    if (generation !== this.generation) return undefined;\n    if (stale) {\n      emitFarmEvent({\n        type: \"cache.stale\",\n        key,\n        tags: [...entry.tags],\n        revalidate: entry.revalidate,\n      });\n      if (!options.allowStale) {\n        emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n        return undefined;\n      }\n    }\n\n    emitFarmEvent({\n      type: \"cache.hit\",\n      key,\n      tags: [...entry.tags],\n      revalidate: entry.revalidate,\n      stale,\n    });\n\n    if (this.local && !stale) {\n      this.hydrateLocalEntry(entry);\n    }\n    return { ...entry, key };\n  }\n\n  set<T>(key: string, value: T, options: FarmCacheSetOptions = {}): FarmCacheEntry<T> {\n    const tags = new Set<string>();\n    for (const tag of options.tags ?? []) {\n      tags.add(normalizeCacheTag(tag));\n    }\n    for (const routePath of options.paths ?? []) {\n      tags.add(createPathCacheTag(routePath));\n    }\n\n    const entry: InternalFarmCacheEntry<T> = {\n      key,\n      value,\n      tags,\n      tagVersions: undefined,\n      createdAt: options.createdAt ?? Date.now(),\n      createdVersion: ++this.version,\n      revalidate: normalizeRevalidate(options.revalidate),\n    };\n\n    this.entries.set(key, entry);\n    emitFarmEvent({\n      type: \"cache.set\",\n      key,\n      tags: Array.from(tags),\n      revalidate: entry.revalidate,\n    });\n    return this.toPublicEntry(entry);\n  }\n\n  async setAsync<T>(\n    key: string,\n    value: T,\n    options: FarmCacheSetOptions = {},\n    tagVersions?: Readonly<Record<string, number>>,\n  ): Promise<FarmCacheEntry<T>> {\n    return this.writeAsync(key, value, options, tagVersions);\n  }\n\n  private async writeAsync<T>(\n    key: string,\n    value: T,\n    options: FarmCacheSetOptions,\n    tagVersions?: Readonly<Record<string, number>>,\n    createdVersion?: number,\n  ): Promise<FarmCacheEntry<T>> {\n    const tags = normalizeCacheOptionsTags(options);\n    const capturedVersions =\n      tagVersions ?? (await this.getAdapterTagVersions(Array.from(tags.values())));\n    const entry: FarmCacheEntry<T> = {\n      key,\n      value,\n      tags: Array.from(tags),\n      tagVersions: capturedVersions,\n      createdAt: options.createdAt ?? Date.now(),\n      createdVersion: createdVersion ?? ++this.version,\n      revalidate: normalizeRevalidate(options.revalidate),\n    };\n\n    if (this.local) {\n      this.hydrateLocalEntry(entry);\n    }\n    if (this.adapter) {\n      await this.adapter.set(this.createAdapterKey(key), entry);\n    }\n\n    emitFarmEvent({\n      type: \"cache.set\",\n      key,\n      tags: [...entry.tags],\n      revalidate: entry.revalidate,\n    });\n    return entry;\n  }\n\n  delete(key: string): boolean {\n    const deleted = this.entries.delete(key);\n    emitFarmEvent({ type: \"cache.delete\", key, deleted });\n    return deleted;\n  }\n\n  async deleteAsync(key: string): Promise<boolean> {\n    const deleted = this.entries.delete(key);\n    if (this.adapter) {\n      await this.adapter.delete(this.createAdapterKey(key));\n    }\n    emitFarmEvent({ type: \"cache.delete\", key, deleted: this.adapter ? true : deleted });\n    return this.adapter ? true : deleted;\n  }\n\n  clear(): void {\n    const count = this.entries.size;\n    this.generation++;\n    this.entries.clear();\n    this.inflight.clear();\n    this.invalidatedTagVersions.clear();\n    this.version = 0;\n    emitFarmEvent({ type: \"cache.clear\", count });\n  }\n\n  async clearAsync(): Promise<void> {\n    this.clear();\n    await this.adapter?.clear?.();\n  }\n\n  isStale(entry: FarmCacheStaleEntry, now = Date.now()): boolean {\n    if (\n      typeof entry.revalidate === \"number\" &&\n      entry.revalidate >= 0 &&\n      now - entry.createdAt >= entry.revalidate * 1000\n    ) {\n      return true;\n    }\n\n    for (const tag of entry.tags) {\n      const invalidatedVersion = this.invalidatedTagVersions.get(normalizeCacheTag(tag));\n      if (\n        typeof invalidatedVersion === \"number\" &&\n        typeof entry.createdVersion === \"number\" &&\n        invalidatedVersion > entry.createdVersion\n      ) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  async isStaleAsync(entry: FarmCacheEntry, now = Date.now()): Promise<boolean> {\n    if (this.adapter) {\n      return this.isAdapterEntryStale(entry, now);\n    }\n    return this.isStale(entry, now);\n  }\n\n  revalidateTag(\n    tag: string,\n    options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n  ): number {\n    const normalized = normalizeCacheTag(tag);\n    const count = this.invalidateTag(normalized);\n    emitFarmEvent(\n      options.source === \"updateTag\"\n        ? { type: \"cache.updateTag\", tag: normalized, count }\n        : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n    );\n    return count;\n  }\n\n  async revalidateTagAsync(\n    tag: string,\n    options: { source?: \"revalidateTag\" | \"updateTag\"; profile?: RevalidateTagProfile } = {},\n  ): Promise<number> {\n    const normalized = normalizeCacheTag(tag);\n    const count = this.invalidateTag(normalized);\n    await this.adapter?.invalidateTags?.([this.createAdapterTag(normalized)]);\n    emitFarmEvent(\n      options.source === \"updateTag\"\n        ? { type: \"cache.updateTag\", tag: normalized, count }\n        : { type: \"cache.revalidateTag\", tag: normalized, profile: options.profile, count },\n    );\n    return count;\n  }\n\n  revalidatePath(routePath: string): number {\n    const normalizedPath = normalizeRevalidatePath(routePath);\n    const pathTag = createPathCacheTag(normalizedPath);\n    const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n    const count = this.invalidateTag(pathTag);\n    emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n    if (pprCount > 0) {\n      emitFarmEvent({\n        type: \"ppr.shell.invalidated\",\n        route: normalizedPath,\n        reason: \"revalidatePath\",\n        count: pprCount,\n      });\n    }\n\n    return count;\n  }\n\n  async revalidatePathAsync(routePath: string): Promise<number> {\n    const normalizedPath = normalizeRevalidatePath(routePath);\n    const pathTag = createPathCacheTag(normalizedPath);\n    const pprCount = this.countEntriesForTags([pathTag, \"ppr\"]);\n    const count = this.invalidateTag(pathTag);\n    await this.adapter?.invalidateTags?.([this.createAdapterTag(pathTag)]);\n    emitFarmEvent({ type: \"cache.revalidatePath\", path: normalizedPath, count });\n\n    if (pprCount > 0) {\n      emitFarmEvent({\n        type: \"ppr.shell.invalidated\",\n        route: normalizedPath,\n        reason: \"revalidatePath\",\n        count: pprCount,\n      });\n    }\n\n    return count;\n  }\n\n  async getOrSet<T>(\n    key: string,\n    producer: () => Promise<T> | T,\n    options: FarmCacheOptions = {},\n  ): Promise<T> {\n    const cached = await this.getEntryAsync<T>(key);\n    if (cached) {\n      return cached.value;\n    }\n\n    const inflight = this.inflight.get(key) as Promise<T> | undefined;\n    if (inflight) {\n      emitFarmEvent({ type: \"cache.dedupe\", key });\n      return inflight;\n    }\n\n    const tags = Array.from(normalizeCacheOptionsTags(options));\n    const generation = this.generation;\n    const promise = this.fillCacheEntry(key, producer, options, tags, generation)\n      .catch((error) => {\n        emitFarmEvent({ type: \"cache.error\", key, operation: \"set\", error });\n        throw error;\n      })\n      .finally(() => {\n        if (this.inflight.get(key) === promise) {\n          this.inflight.delete(key);\n        }\n      });\n\n    this.inflight.set(key, promise);\n    return promise;\n  }\n\n  private async fillCacheEntry<T>(\n    key: string,\n    producer: () => Promise<T> | T,\n    options: FarmCacheOptions,\n    tags: readonly string[],\n    generation: number,\n  ): Promise<T> {\n    const adapter = this.adapter;\n    const namespace = this.namespace;\n    const lease = { ...this.lease };\n    const leaseKey = `${namespace}:lease:${key}`;\n    let leaseToken: string | null | undefined;\n\n    if (adapter?.acquireLease && adapter.releaseLease && lease.enabled) {\n      leaseToken = await adapter.acquireLease(leaseKey, lease.ttlMs);\n      if (!leaseToken) {\n        const shared = await this.waitForAdapterEntry<T>(\n          key,\n          adapter,\n          namespace,\n          lease,\n          generation,\n        );\n        if (shared) {\n          emitFarmEvent({ type: \"cache.dedupe\", key });\n          return shared.value;\n        }\n        if (generation === this.generation) {\n          leaseToken = await adapter.acquireLease(leaseKey, lease.ttlMs);\n        }\n      }\n    }\n\n    try {\n      const initialCreatedVersion = this.version;\n      const initialTagVersions = await this.getAdapterTagVersions(tags, adapter, namespace);\n      const value = await producer();\n      if (generation === this.generation) {\n        await this.writeAsync(key, value, options, initialTagVersions, initialCreatedVersion);\n      }\n      return value;\n    } finally {\n      if (leaseToken && adapter?.releaseLease) {\n        await adapter.releaseLease(leaseKey, leaseToken);\n      }\n    }\n  }\n\n  private async waitForAdapterEntry<T>(\n    key: string,\n    adapter: FarmCacheAdapter,\n    namespace: string,\n    lease: typeof this.lease,\n    generation: number,\n  ): Promise<FarmCacheEntry<T> | undefined> {\n    const deadline = Date.now() + lease.waitTimeoutMs;\n    while (Date.now() < deadline) {\n      await delay(lease.pollIntervalMs);\n      if (generation !== this.generation) return undefined;\n      const entry = await adapter.get<T>(`${namespace}:entry:${key}`);\n      if (generation !== this.generation) return undefined;\n      if (!entry) {\n        emitFarmEvent({ type: \"cache.miss\", key });\n        continue;\n      }\n      assertFarmCacheEntry(entry, key);\n      const stale = await this.isAdapterEntryStale(entry, Date.now(), adapter, namespace);\n      if (generation !== this.generation) return undefined;\n      if (stale) {\n        emitFarmEvent({\n          type: \"cache.stale\",\n          key,\n          tags: [...entry.tags],\n          revalidate: entry.revalidate,\n        });\n        emitFarmEvent({ type: \"cache.miss\", key, reason: \"stale\" });\n      } else {\n        emitFarmEvent({\n          type: \"cache.hit\",\n          key,\n          tags: [...entry.tags],\n          revalidate: entry.revalidate,\n          stale: false,\n        });\n        return { ...entry, key };\n      }\n    }\n    return undefined;\n  }\n\n  private countEntriesForTag(tag: string): number {\n    let count = 0;\n    for (const entry of this.entries.values()) {\n      if (entry.tags.has(tag)) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  private countEntriesForTags(tags: readonly string[]): number {\n    let count = 0;\n    for (const entry of this.entries.values()) {\n      if (tags.every((tag) => entry.tags.has(tag))) {\n        count++;\n      }\n    }\n    return count;\n  }\n\n  private invalidateTag(normalizedTag: string): number {\n    this.invalidatedTagVersions.set(normalizedTag, ++this.version);\n    return this.countEntriesForTag(normalizedTag);\n  }\n\n  private toPublicEntry<T>(entry: InternalFarmCacheEntry<T>): FarmCacheEntry<T> {\n    return {\n      key: entry.key,\n      value: entry.value,\n      tags: Array.from(entry.tags),\n      tagVersions: entry.tagVersions,\n      createdAt: entry.createdAt,\n      createdVersion: entry.createdVersion,\n      revalidate: entry.revalidate,\n    };\n  }\n\n  private hydrateLocalEntry<T>(entry: FarmCacheEntry<T>): void {\n    this.entries.set(entry.key, {\n      key: entry.key,\n      value: entry.value,\n      tags: new Set(entry.tags.map(normalizeCacheTag)),\n      tagVersions: entry.tagVersions,\n      createdAt: entry.createdAt,\n      createdVersion: entry.createdVersion ?? ++this.version,\n      revalidate: normalizeRevalidate(entry.revalidate),\n    });\n  }\n\n  private createAdapterKey(key: string): string {\n    return `${this.namespace}:entry:${key}`;\n  }\n\n  private createAdapterTag(tag: string): string {\n    return `${this.namespace}:tag:${tag}`;\n  }\n\n  private async getAdapterTagVersions(\n    tags: readonly string[],\n    adapter = this.adapter,\n    namespace = this.namespace,\n  ): Promise<Readonly<Record<string, number>>> {\n    if (!adapter?.getTagVersions || tags.length === 0) return {};\n\n    const normalized = tags.map(normalizeCacheTag);\n    const physicalTags = normalized.map((tag) => `${namespace}:tag:${tag}`);\n    const versions = await adapter.getTagVersions(physicalTags);\n    return Object.fromEntries(\n      normalized.map((tag, index) => [\n        tag,\n        normalizeAdapterVersion(versions[physicalTags[index]!]),\n      ]),\n    );\n  }\n\n  private async isAdapterEntryStale(\n    entry: FarmCacheEntry,\n    now = Date.now(),\n    adapter = this.adapter,\n    namespace = this.namespace,\n  ): Promise<boolean> {\n    if (\n      typeof entry.revalidate === \"number\" &&\n      entry.revalidate >= 0 &&\n      now - entry.createdAt >= entry.revalidate * 1000\n    ) {\n      return true;\n    }\n\n    const currentVersions = await this.getAdapterTagVersions(entry.tags, adapter, namespace);\n    for (const tag of entry.tags) {\n      if (\n        normalizeAdapterVersion(currentVersions[tag]) >\n        normalizeAdapterVersion(entry.tagVersions?.[tag])\n      ) {\n        return true;\n      }\n    }\n    return false;\n  }\n}\n\nconst FARM_DATA_CACHE_SYMBOL = Symbol.for(\"farm.dataCache\");\nconst farmDataCacheGlobal = globalThis as typeof globalThis & {\n  [FARM_DATA_CACHE_SYMBOL]?: FarmDataCache;\n};\nconst sharedFarmDataCache = (farmDataCacheGlobal[FARM_DATA_CACHE_SYMBOL] ??= new FarmDataCache());\n\nexport function getFarmDataCache(): FarmDataCache {\n  return sharedFarmDataCache;\n}\n\nexport function configureFarmCache(config: FarmCacheUserConfig | undefined): void {\n  sharedFarmDataCache.configure(config);\n}\n\n/**\n * Wrap an async function so its results are cached and shared across requests,\n * processes, and restarts.\n *\n * The cache key is built from the wrapped function's identity (its name and a\n * hash of its source), the active locale, `keyParts`, and the call arguments.\n * Deriving identity from the source — rather than the closure instance — is\n * deliberate: it keeps the key stable across processes and restarts so a\n * distributed cache adapter can share entries between server instances.\n *\n * The consequence is that two closures with **identical source text but\n * different captured variables** produce the same identity. Pass those captured\n * values in `keyParts` so they take part in the key; otherwise the closures\n * share a cache entry and return each other's data:\n *\n * ```ts\n * // Collides: both closures have identical source, and `table` is captured,\n * // not an argument, so it never reaches the key.\n * const makeLoader = (table: string) =>\n *   unstable_cache(async (id: number) => db.get(table, id));\n *\n * // Correct: the captured value disambiguates the two closures.\n * const makeLoader = (table: string) =>\n *   unstable_cache(async (id: number) => db.get(table, id), [table]);\n * ```\n *\n * Values passed as call arguments already participate in the key and do not\n * need to be repeated in `keyParts`.\n *\n * @param fn The async function to memoize.\n * @param keyParts Extra values that identify this call site. Include every\n *   variable the function closes over that is not one of its arguments.\n * @param options Tags, paths, and revalidation settings for the cached entry.\n */\nexport function unstable_cache<Args extends unknown[], Result>(\n  fn: (...args: Args) => Result | Promise<Result>,\n  keyParts: readonly unknown[] = [],\n  options: FarmCacheOptions = {},\n): (...args: Args) => Promise<Result> {\n  return async (...args: Args): Promise<Result> => {\n    const locale = getActiveFarmI18nSnapshot()?.locale;\n    const key = createFarmCacheKey([\n      \"unstable_cache\",\n      getFunctionCacheIdentity(fn),\n      locale ? [\"locale\", locale] : null,\n      keyParts,\n      args,\n    ]);\n    return getFarmDataCache().getOrSet<Result>(key, () => fn(...args), options);\n  };\n}\n\n/**\n * Invalidate every cache entry carrying `tag`.\n *\n * Observability note: the `count` on the emitted `cache.revalidateTag` event is\n * derived from Farm's process-local entry tracking. With a shared `cache.adapter`\n * configured, entries live in the adapter rather than in local memory, so the\n * count can read as `0` even though the invalidation is still propagated to the\n * adapter and applied. Treat it as a best-effort signal, not a distributed count.\n */\nexport function revalidateTag(_tag: string, _profile?: RevalidateTagProfile): void | Promise<void> {\n  const cache = getFarmDataCache();\n  if (cache.hasAdapter) {\n    const task = cache\n      .revalidateTagAsync(_tag, {\n        source: \"revalidateTag\",\n        profile: _profile,\n      })\n      .then(() => undefined);\n    notifyFarmCacheTask(task);\n    return task;\n  }\n  cache.revalidateTag(_tag, {\n    source: \"revalidateTag\",\n    profile: _profile,\n  });\n}\n\nexport function updateTag(tag: string): void | Promise<void> {\n  const cache = getFarmDataCache();\n  if (cache.hasAdapter) {\n    const task = cache.revalidateTagAsync(tag, { source: \"updateTag\" }).then(() => undefined);\n    notifyFarmCacheTask(task);\n    return task;\n  }\n  cache.revalidateTag(tag, { source: \"updateTag\" });\n}\n\n/**\n * Invalidate cached data for a route path (and its PPR shell, if any).\n *\n * Observability note: the `count` on the emitted `cache.revalidatePath` event and\n * the `ppr.shell.invalidated` event are derived from process-local entry tracking.\n * With a shared `cache.adapter`, PPR shells live in the adapter rather than in\n * local memory, so the count can read as `0` and `ppr.shell.invalidated` may not\n * be emitted even though the invalidation is still propagated to the adapter and\n * applied.\n */\nexport function revalidatePath(routePath: string): void | Promise<void> {\n  const cache = getFarmDataCache();\n  if (cache.hasAdapter) {\n    const task = cache.revalidatePathAsync(routePath).then(() => undefined);\n    notifyFarmCacheTask(task);\n    return task;\n  }\n  cache.revalidatePath(routePath);\n}\n\nexport function invalidate(key: RouteDataCacheKey): void | Promise<void> {\n  const clientKey = createRouteDataCacheKey(key);\n  const task = updateTag(createRouteDataCacheTag(key));\n  notifyFarmCacheInvalidation(clientKey);\n  return task;\n}\n\nexport function invalidateRouteData(key: RouteDataCacheKey): void | Promise<void> {\n  return invalidate(key);\n}\n\n/**\n * Apply a normalized set of invalidation targets and return browser cache keys\n * that should be carried with an action/endpoint response.\n */\nexport async function applyFarmCacheInvalidationTargets(\n  targets: readonly FarmCacheInvalidationTarget[],\n): Promise<readonly string[]> {\n  if (!Array.isArray(targets)) {\n    throw new TypeError(\"Cache invalidations must resolve to an array of targets.\");\n  }\n\n  const clientKeys: string[] = [];\n  for (const target of targets) {\n    assertFarmCacheInvalidationTarget(target);\n    if (\"key\" in target) {\n      await invalidate(target.key);\n      clientKeys.push(createRouteDataCacheKey(target.key));\n    } else if (\"path\" in target) {\n      await revalidatePath(target.path);\n    } else {\n      await updateTag(target.tag);\n    }\n  }\n  return Array.from(new Set(clientKeys));\n}\n\nexport function createPathCacheTag(routePath: string): string {\n  return `path:${normalizeRevalidatePath(routePath)}`;\n}\n\nexport function createRouteDataCacheTag(key: RouteDataCacheKey): string {\n  return `route-data:${createRouteDataCacheKey(key)}`;\n}\n\nexport function createRouteDataCacheKey(key: RouteDataCacheKey): string {\n  return createFarmCacheKey(Array.isArray(key) ? key : [key]);\n}\n\nexport function normalizeRevalidatePath(routePath: string): string {\n  if (typeof routePath !== \"string\") {\n    throw new TypeError(\"revalidatePath expects a path string.\");\n  }\n\n  let normalized = routePath.trim();\n  if (!normalized) {\n    throw new Error(\"revalidatePath expects a non-empty path.\");\n  }\n\n  try {\n    if (/^https?:\\/\\//i.test(normalized)) {\n      normalized = new URL(normalized).pathname;\n    }\n  } catch {\n    // Keep the original path if URL parsing fails.\n  }\n\n  normalized = normalized.split(/[?#]/, 1)[0] ?? normalized;\n  normalized = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n  normalized = normalized.replace(/\\/{2,}/g, \"/\");\n  if (normalized.length > 1) {\n    normalized = normalized.replace(/\\/+$/, \"\");\n  }\n  return normalized || \"/\";\n}\n\nexport function createFarmCacheKey(parts: readonly unknown[]): string {\n  return stableSerialize(parts);\n}\n\nfunction normalizeRevalidate(revalidate: number | false | undefined): number | false | undefined {\n  if (revalidate === false || revalidate === undefined) {\n    return revalidate;\n  }\n  if (!Number.isFinite(revalidate) || revalidate < 0) {\n    return undefined;\n  }\n  // 0 is meaningful: the entry is stale immediately, i.e. always re-produced.\n  return revalidate;\n}\n\nfunction normalizeCacheTag(tag: string): string {\n  if (typeof tag !== \"string\") {\n    throw new TypeError(\"Cache tags must be strings.\");\n  }\n  const normalized = tag.trim();\n  if (!normalized) {\n    throw new Error(\"Cache tags cannot be empty.\");\n  }\n  return normalized;\n}\n\nfunction normalizeCacheNamespace(namespace: string): string {\n  if (typeof namespace !== \"string\") {\n    throw new TypeError(\"Cache namespace must be a string.\");\n  }\n  const normalized = namespace.trim().replace(/:+$/g, \"\");\n  if (!normalized) {\n    throw new Error(\"Cache namespace cannot be empty.\");\n  }\n  return normalized;\n}\n\nfunction normalizeAdapterVersion(value: unknown): number {\n  return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction normalizePositiveDuration(\n  value: number | undefined,\n  fallback: number,\n  name: string,\n): number {\n  if (value === undefined) return fallback;\n  if (!Number.isFinite(value) || value <= 0) {\n    throw new TypeError(`${name} must be a positive number of milliseconds.`);\n  }\n  return Math.floor(value);\n}\n\nfunction delay(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction normalizeCacheOptionsTags(options: FarmCacheOptions): Set<string> {\n  const tags = new Set<string>();\n  for (const tag of options.tags ?? []) {\n    tags.add(normalizeCacheTag(tag));\n  }\n  for (const routePath of options.paths ?? []) {\n    tags.add(createPathCacheTag(routePath));\n  }\n  return tags;\n}\n\nfunction assertFarmCacheEntry(\n  entry: FarmCacheEntry,\n  expectedKey: string,\n): asserts entry is FarmCacheEntry {\n  if (\n    !entry ||\n    typeof entry !== \"object\" ||\n    entry.key !== expectedKey ||\n    !Array.isArray(entry.tags) ||\n    typeof entry.createdAt !== \"number\"\n  ) {\n    throw new TypeError(\n      `Cache adapter returned an invalid entry for ${JSON.stringify(expectedKey)}.`,\n    );\n  }\n}\n\nfunction assertFarmCacheInvalidationTarget(\n  target: unknown,\n): asserts target is FarmCacheInvalidationTarget {\n  if (!target || typeof target !== \"object\") {\n    throw new TypeError(\"Cache invalidation targets must be { key }, { path }, or { tag }.\");\n  }\n\n  if (\"key\" in target) {\n    const key = (target as { key?: unknown }).key;\n    if (typeof key === \"string\" || Array.isArray(key)) return;\n  } else if (\"path\" in target && typeof (target as { path?: unknown }).path === \"string\") {\n    return;\n  } else if (\"tag\" in target && typeof (target as { tag?: unknown }).tag === \"string\") {\n    return;\n  }\n\n  throw new TypeError(\"Cache invalidation targets must contain a string/array key, path, or tag.\");\n}\n\nfunction getFunctionCacheIdentity(fn: Function): string {\n  // The name alone collides across modules — two different functions both\n  // named getUser would share cache entries. Include a hash of the source so\n  // only genuinely identical functions share, and the identity stays stable\n  // across processes and restarts.\n  const name = fn.name || \"anonymous\";\n  return `${name}:${hashFunctionSource(String(fn))}`;\n}\n\nfunction hashFunctionSource(source: string): string {\n  // FNV-1a, 32-bit.\n  let hash = 0x811c9dc5;\n  for (let index = 0; index < source.length; index++) {\n    hash ^= source.charCodeAt(index);\n    hash = Math.imul(hash, 0x01000193);\n  }\n  return (hash >>> 0).toString(36);\n}\n\nfunction compareCodepoint(a: string, b: string): number {\n  return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction serializeBinaryBytes(bytes: Uint8Array): string {\n  return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction serializeCanonicalStringEntries(\n  entries: Iterable<readonly [string, string]>,\n  seen: WeakSet<object>,\n): string {\n  const valuesByKey = new Map<string, string[]>();\n  for (const [key, item] of entries) {\n    const values = valuesByKey.get(key);\n    if (values) values.push(item);\n    else valuesByKey.set(key, [item]);\n  }\n\n  return Array.from(valuesByKey.keys())\n    .sort(compareCodepoint)\n    .flatMap((key) =>\n      valuesByKey\n        .get(key)!\n        .map((item) => `[${stableSerialize(key, seen)},${stableSerialize(item, seen)}]`),\n    )\n    .join(\",\");\n}\n\nfunction stableSerialize(value: unknown, seen = new WeakSet<object>()): string {\n  if (value === null) return \"null\";\n  if (value === undefined) return \"undefined\";\n\n  const valueType = typeof value;\n  if (valueType === \"string\") return JSON.stringify(value);\n  if (valueType === \"number\" || valueType === \"boolean\" || valueType === \"bigint\") {\n    return `${valueType}:${String(value)}`;\n  }\n  if (valueType === \"symbol\") {\n    return `symbol:${String(value)}`;\n  }\n  if (valueType === \"function\") {\n    return `function:${getFunctionCacheIdentity(value as Function)}`;\n  }\n\n  if (value instanceof Date) {\n    // toISOString throws on an Invalid Date. Key building must not throw on a\n    // supported type, so all invalid dates share one stable marker and the\n    // caller's own validation decides what to do with the input.\n    return Number.isNaN(value.getTime()) ? \"date:invalid\" : `date:${value.toISOString()}`;\n  }\n  if (value instanceof URL) {\n    return `url:${value.toString()}`;\n  }\n  if (value instanceof RegExp) {\n    return `regexp:${value.toString()}`;\n  }\n  if (value instanceof ArrayBuffer) {\n    return `arraybuffer:${serializeBinaryBytes(new Uint8Array(value))}`;\n  }\n  if (typeof SharedArrayBuffer !== \"undefined\" && value instanceof SharedArrayBuffer) {\n    return `sharedarraybuffer:${serializeBinaryBytes(new Uint8Array(value))}`;\n  }\n  if (ArrayBuffer.isView(value)) {\n    const viewType = Object.prototype.toString.call(value).slice(8, -1);\n    const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n    return `binary:${viewType}:${serializeBinaryBytes(bytes)}`;\n  }\n\n  if (value && typeof value === \"object\") {\n    if (seen.has(value)) {\n      return \"[Circular]\";\n    }\n    seen.add(value);\n\n    if (Array.isArray(value)) {\n      const items: string[] = [];\n      for (let index = 0; index < value.length; index++) {\n        items.push(\n          Object.prototype.hasOwnProperty.call(value, index)\n            ? stableSerialize(value[index], seen)\n            : \"[Hole]\",\n        );\n      }\n      seen.delete(value);\n      return `[${items.join(\",\")}]`;\n    }\n\n    // Set and Map keep their contents internally, so Object.entries is empty\n    // for both. Serialize the contents and sort them by codepoint so equal\n    // contents give the same key regardless of insertion order.\n    if (value instanceof Set) {\n      const items = Array.from(value, (item) => stableSerialize(item, seen)).sort(compareCodepoint);\n      seen.delete(value);\n      return `set:[${items.join(\",\")}]`;\n    }\n    if (value instanceof Map) {\n      const items = Array.from(\n        value,\n        ([key, item]) => `[${stableSerialize(key, seen)},${stableSerialize(item, seen)}]`,\n      ).sort(compareCodepoint);\n      seen.delete(value);\n      return `map:[${items.join(\",\")}]`;\n    }\n    // URLSearchParams and Headers keep their contents internally, so\n    // Object.entries is empty for both (same rationale as Set/Map above).\n    // Canonicalize key order while preserving the order of repeated values for\n    // each key. URLSearchParams treats `a=1&a=2` and `a=2&a=1` as observably\n    // different inputs, while `b=2&a=1` and `a=1&b=2` should still share a key.\n    if (value instanceof URLSearchParams) {\n      const serialized = serializeCanonicalStringEntries(value, seen);\n      seen.delete(value);\n      return `urlsearchparams:[${serialized}]`;\n    }\n    if (value instanceof Headers) {\n      const serialized = serializeCanonicalStringEntries(value, seen);\n      seen.delete(value);\n      return `headers:[${serialized}]`;\n    }\n\n    // Codepoint comparison, not localeCompare: the host locale must not\n    // change how a \"stable\" key serializes, or invalidations computed on one\n    // server can miss entries written by another.\n    const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n      compareCodepoint(a, b),\n    );\n    const serialized = entries\n      .map(([key, item]) => `${JSON.stringify(key)}:${stableSerialize(item, seen)}`)\n      .join(\",\");\n\n    seen.delete(value);\n    return `{${serialized}}`;\n  }\n\n  return String(value);\n}\n","/// <reference lib=\"es2021.weakref\" />\nimport { createRouteDataCacheKey, type RouteDataCacheKey } from \"./cache\";\nimport { subscribeFarmCacheInvalidation } from \"./cache-invalidation\";\n\nexport type FarmClientCacheKey = RouteDataCacheKey;\n\nexport type FarmClientCacheStatus = \"idle\" | \"pending\" | \"success\" | \"error\";\n\nexport type FarmClientCacheEntry<TData = unknown> = {\n  data: TData;\n  updatedAt: number;\n  staleAt: number;\n  gcAt?: number;\n  invalidatedAt?: number;\n  status?: FarmClientCacheStatus;\n  error?: Error | null;\n  fetching?: boolean;\n  /** Marks an entry the persistence layer may write to its adapter. */\n  persist?: boolean;\n};\n\n/** @internal Observation seam for the client cache persistence engine. */\nexport type FarmClientCachePersistenceSink = {\n  onSet(key: string, entry: FarmClientCacheEntry): void;\n  onDelete(key: string): void;\n  onClear(): void;\n};\n\ntype FarmClientCacheListener = (event?: \"invalidate\") => void;\n\nconst invalidationTrackers = new WeakMap<FarmClientDataCache, Set<Set<string>>>();\n\n/** Internal request-lifetime tracking, including keys learned only from a response. */\nexport function trackFarmClientCacheInvalidations(cache: FarmClientDataCache) {\n  let trackers = invalidationTrackers.get(cache);\n  if (!trackers) {\n    trackers = new Set();\n    invalidationTrackers.set(cache, trackers);\n  }\n  const keys = new Set<string>();\n  trackers.add(keys);\n  return {\n    has(key: string) {\n      const resolved = cache.resolveKey(key);\n      for (const invalidated of keys) {\n        if (cache.resolveKey(invalidated) === resolved) return true;\n      }\n      return false;\n    },\n    dispose() {\n      if (!trackers.delete(keys)) return;\n      keys.clear();\n      if (trackers.size === 0) invalidationTrackers.delete(cache);\n    },\n  };\n}\n\nconst cacheFinalizer =\n  typeof FinalizationRegistry === \"function\"\n    ? new FinalizationRegistry<() => void>((unsubscribe) => unsubscribe())\n    : undefined;\n\n// This closure must only capture a weak reference, never the cache itself.\nfunction subscribeWeakCache(reference: WeakRef<FarmClientDataCache>): () => void {\n  const unsubscribe = subscribeFarmCacheInvalidation((key) => {\n    const cache = reference.deref();\n    if (cache) cache.invalidate(key);\n    else dispose();\n  });\n  function dispose() {\n    unsubscribe();\n    cacheFinalizer?.unregister(reference);\n  }\n  return dispose;\n}\n\nconst DEFAULT_GC_SWEEP_INTERVAL_MS = 30_000;\n\nexport class FarmClientDataCache {\n  private entries = new Map<string, FarmClientCacheEntry>();\n  private aliases = new Map<string, string>();\n  private invalidatedAt = new Map<string, number>();\n  private listeners = new Map<string, Set<FarmClientCacheListener>>();\n  private inflight = new Map<string, Promise<unknown>>();\n  private unsubscribeInvalidation: (() => void) | undefined;\n  private gcTimer: ReturnType<typeof setTimeout> | undefined;\n  private readonly gcSweepIntervalMs: number | false;\n  private persistence: FarmClientCachePersistenceSink | undefined;\n\n  constructor(\n    options: { subscribeToInvalidation?: boolean; gcSweepIntervalMs?: number | false } = {},\n  ) {\n    this.gcSweepIntervalMs = options.gcSweepIntervalMs ?? DEFAULT_GC_SWEEP_INTERVAL_MS;\n    if (options.subscribeToInvalidation !== false) {\n      if (typeof WeakRef === \"function\") {\n        const reference = new WeakRef(this);\n        const unsubscribe = subscribeWeakCache(reference);\n        cacheFinalizer?.register(this, unsubscribe, reference);\n        this.unsubscribeInvalidation = unsubscribe;\n      } else {\n        // Keep invalidation working on older runtimes without weak references.\n        this.unsubscribeInvalidation = subscribeFarmCacheInvalidation((key) =>\n          this.invalidate(key),\n        );\n      }\n    }\n  }\n\n  get size(): number {\n    return this.entries.size;\n  }\n\n  /** @internal Attach or detach the persistence engine's observation sink. */\n  attachPersistence(sink: FarmClientCachePersistenceSink | undefined): void {\n    this.persistence = sink;\n  }\n\n  resolveKey(key: string): string {\n    let resolved = key;\n    const seen = new Set<string>();\n\n    while (this.aliases.has(resolved) && !seen.has(resolved)) {\n      seen.add(resolved);\n      resolved = this.aliases.get(resolved)!;\n    }\n\n    return resolved;\n  }\n\n  get<TData = unknown>(key: string, now = Date.now()): FarmClientCacheEntry<TData> | undefined {\n    const resolved = this.resolveKey(key);\n    const entry = this.entries.get(resolved) as FarmClientCacheEntry<TData> | undefined;\n    if (!entry) return undefined;\n\n    if (entry.gcAt !== undefined && now >= entry.gcAt) {\n      this.entries.delete(resolved);\n      this.persistence?.onDelete(resolved);\n      this.emit(resolved);\n      return undefined;\n    }\n\n    return entry;\n  }\n\n  set<TData>(key: string, entry: FarmClientCacheEntry<TData>): this {\n    const resolved = this.resolveKey(key);\n    const invalidatedAt = this.invalidatedAt.get(resolved);\n    const nextEntry =\n      invalidatedAt !== undefined && invalidatedAt > entry.updatedAt\n        ? { ...entry, staleAt: 0, invalidatedAt }\n        : { ...entry, invalidatedAt: undefined };\n\n    if (invalidatedAt === undefined || entry.updatedAt >= invalidatedAt) {\n      this.invalidatedAt.delete(resolved);\n    }\n\n    this.entries.set(resolved, nextEntry);\n    if (nextEntry.gcAt !== undefined) this.scheduleGcSweep();\n    this.persistence?.onSet(resolved, nextEntry);\n    this.emit(resolved);\n    return this;\n  }\n\n  delete(key: string): boolean {\n    const resolved = this.resolveKey(key);\n    const deleted = this.entries.delete(resolved);\n    this.inflight.delete(resolved);\n    if (deleted) this.persistence?.onDelete(resolved);\n    this.emit(resolved);\n    return deleted;\n  }\n\n  clear(): void {\n    const keys = new Set([...this.entries.keys(), ...this.listeners.keys()]);\n    this.entries.clear();\n    this.aliases.clear();\n    this.invalidatedAt.clear();\n    this.inflight.clear();\n    this.persistence?.onClear();\n    for (const key of keys) this.emit(key);\n  }\n\n  dispose(): void {\n    this.unsubscribeInvalidation?.();\n    this.unsubscribeInvalidation = undefined;\n    if (this.gcTimer !== undefined) {\n      clearTimeout(this.gcTimer);\n      this.gcTimer = undefined;\n    }\n    this.clear();\n  }\n\n  isStale(key: string, now = Date.now()): boolean {\n    const entry = this.get(key, now);\n    return !entry || entry.invalidatedAt !== undefined || now >= entry.staleAt;\n  }\n\n  invalidate(key: string, now = Date.now()): void {\n    const resolved = this.resolveKey(key);\n    for (const keys of invalidationTrackers.get(this) ?? []) keys.add(resolved);\n    this.invalidatedAt.set(resolved, now);\n\n    const entry = this.entries.get(resolved);\n    if (entry) {\n      this.entries.set(resolved, {\n        ...entry,\n        staleAt: 0,\n        invalidatedAt: now,\n      });\n    }\n\n    this.emit(resolved, \"invalidate\");\n  }\n\n  alias(alias: string, key: string): void {\n    const resolved = this.resolveKey(key);\n    if (alias === resolved) return;\n\n    const aliasEntry = this.entries.get(alias);\n    const aliasInvalidatedAt = this.invalidatedAt.get(alias) ?? aliasEntry?.invalidatedAt;\n    const resolvedInvalidatedAt = this.invalidatedAt.get(resolved);\n    if (aliasEntry && !this.entries.has(resolved)) {\n      this.entries.set(resolved, aliasEntry);\n      this.persistence?.onSet(resolved, aliasEntry);\n    }\n\n    if (this.entries.delete(alias)) this.persistence?.onDelete(alias);\n    this.invalidatedAt.delete(alias);\n    const invalidatedAt = [aliasInvalidatedAt, resolvedInvalidatedAt].reduce<number | undefined>(\n      (latest, value) =>\n        value === undefined ? latest : latest === undefined ? value : Math.max(latest, value),\n      undefined,\n    );\n    const resolvedEntry = this.entries.get(resolved);\n    if (\n      invalidatedAt !== undefined &&\n      (!resolvedEntry || invalidatedAt > resolvedEntry.updatedAt)\n    ) {\n      this.invalidatedAt.set(resolved, invalidatedAt);\n      if (resolvedEntry) {\n        this.entries.set(resolved, {\n          ...resolvedEntry,\n          staleAt: 0,\n          invalidatedAt,\n        });\n      }\n    } else if (invalidatedAt !== undefined) {\n      this.invalidatedAt.delete(resolved);\n      if (resolvedEntry?.invalidatedAt !== undefined) {\n        this.entries.set(resolved, { ...resolvedEntry, invalidatedAt: undefined });\n      }\n    }\n\n    const aliasInflight = this.inflight.get(alias);\n    if (aliasInflight && !this.inflight.has(resolved)) {\n      this.inflight.set(resolved, aliasInflight);\n    }\n    this.inflight.delete(alias);\n    this.aliases.set(alias, resolved);\n    this.emit(alias);\n    this.emit(resolved, this.invalidatedAt.has(resolved) ? \"invalidate\" : undefined);\n  }\n\n  subscribe(key: string, listener: FarmClientCacheListener): () => void {\n    let listeners = this.listeners.get(key);\n    if (!listeners) {\n      listeners = new Set();\n      this.listeners.set(key, listeners);\n    }\n\n    listeners.add(listener);\n    return () => {\n      listeners!.delete(listener);\n      // Only drop the map entry if it still holds this exact set. A repeated or\n      // stale unsubscribe (called after the key was drained and resubscribed)\n      // must not evict a newer subscriber's live listener set.\n      if (listeners!.size === 0 && this.listeners.get(key) === listeners) {\n        this.listeners.delete(key);\n      }\n    };\n  }\n\n  getInflight<TData>(key: string): Promise<TData> | undefined {\n    return this.inflight.get(this.resolveKey(key)) as Promise<TData> | undefined;\n  }\n\n  setInflight<TData>(key: string, promise: Promise<TData>): void {\n    this.inflight.set(this.resolveKey(key), promise);\n  }\n\n  deleteInflight(key: string): void {\n    this.inflight.delete(this.resolveKey(key));\n  }\n\n  private scheduleGcSweep(): void {\n    if (this.gcSweepIntervalMs === false || this.gcTimer !== undefined) return;\n    const timer = setTimeout(() => {\n      this.gcTimer = undefined;\n      this.sweepExpiredEntries();\n    }, this.gcSweepIntervalMs);\n    // Cache cleanup must never keep a Node.js process (SSR, tests) alive.\n    (timer as unknown as { unref?: () => void }).unref?.();\n    this.gcTimer = timer;\n  }\n\n  private sweepExpiredEntries(now = Date.now()): void {\n    const watched = new Set<string>();\n    for (const key of this.listeners.keys()) watched.add(this.resolveKey(key));\n\n    let remaining = false;\n    const swept = new Set<string>();\n    for (const [key, entry] of this.entries) {\n      if (entry.gcAt === undefined) continue;\n      if (now < entry.gcAt || entry.fetching || this.inflight.has(key) || watched.has(key)) {\n        remaining = true;\n        continue;\n      }\n      // Only unwatched entries are swept, so eviction is unobservable: a read\n      // of this key would already evict it lazily before returning data.\n      this.entries.delete(key);\n      this.persistence?.onDelete(key);\n      swept.add(key);\n    }\n\n    if (swept.size > 0) this.sweepEntryMetadata(swept);\n    if (remaining) this.scheduleGcSweep();\n  }\n\n  /**\n   * Entry eviction alone leaves the per-key metadata behind. `invalidatedAt`\n   * marks and provisional aliases are created per query invocation, so with\n   * dynamic keys they accumulate for the lifetime of the page even though the\n   * entries they describe are long gone.\n   */\n  private sweepEntryMetadata(swept: Set<string>): void {\n    for (const key of swept) this.invalidatedAt.delete(key);\n\n    for (const [alias, target] of this.aliases) {\n      // Keep any alias that is still addressable: one that has its own entry,\n      // that something is subscribed to, or whose target is still live.\n      if (this.entries.has(alias) || this.listeners.has(alias)) continue;\n      const resolved = this.resolveKey(target);\n      if (!swept.has(resolved)) continue;\n      if (this.entries.has(resolved) || this.listeners.has(resolved)) continue;\n      this.aliases.delete(alias);\n      this.invalidatedAt.delete(alias);\n    }\n  }\n\n  private emit(key: string, event?: \"invalidate\"): void {\n    this.notifyListeners(key, event);\n    for (const [alias, target] of this.aliases) {\n      if (this.resolveKey(target) === key) {\n        this.notifyListeners(alias, event);\n      }\n    }\n  }\n\n  private notifyListeners(key: string, event?: \"invalidate\"): void {\n    for (const listener of this.listeners.get(key) ?? []) {\n      // One subscriber must not be able to break the others, or to make an\n      // ordinary cache write or invalidation throw in its caller. This matches\n      // the isolation the global invalidation bus already provides.\n      try {\n        listener(event);\n      } catch (error) {\n        const detail = error instanceof Error ? (error.stack ?? error.message) : String(error);\n        console.warn(`[farm:client-cache] cache listener failed: ${detail}`);\n      }\n    }\n  }\n}\n\nconst FARM_CLIENT_DATA_CACHE = Symbol.for(\"farm.clientDataCache\");\nconst clientCacheGlobal = globalThis as typeof globalThis & {\n  [FARM_CLIENT_DATA_CACHE]?: FarmClientDataCache;\n};\nconst sharedFarmClientDataCache = (clientCacheGlobal[FARM_CLIENT_DATA_CACHE] ??=\n  new FarmClientDataCache());\n\nexport function getFarmClientDataCache(): FarmClientDataCache {\n  return sharedFarmClientDataCache;\n}\n\nexport function normalizeFarmClientCacheKey(key: FarmClientCacheKey): string {\n  return typeof key === \"string\" ? key : createRouteDataCacheKey(key);\n}\n","export type FarmRevalidationListenerOptions = {\n  refetchOnWindowFocus?: boolean;\n  refetchOnReconnect?: boolean;\n};\n\n/**\n * Attach the shared window focus/reconnect revalidation listeners used by every\n * query consumer (React `useServerQuery` and the renderer-neutral\n * `createRendererQuery`). Connectivity-driven refresh behavior must live here\n * so all renderers observe the same triggers.\n *\n * Returns a disposer; a no-op outside the browser.\n */\nexport function attachRevalidationListeners(\n  refresh: () => void,\n  options: FarmRevalidationListenerOptions = {},\n): () => void {\n  if (typeof window === \"undefined\") return () => {};\n\n  const onFocus = options.refetchOnWindowFocus === false ? undefined : refresh;\n  const onOnline = options.refetchOnReconnect === false ? undefined : refresh;\n\n  if (onFocus) window.addEventListener(\"focus\", onFocus);\n  if (onOnline) window.addEventListener(\"online\", onOnline);\n  return () => {\n    if (onFocus) window.removeEventListener(\"focus\", onFocus);\n    if (onOnline) window.removeEventListener(\"online\", onOnline);\n  };\n}\n","\"use client\";\n\nimport { createFarmCacheKey } from \"./cache\";\nimport { getFarmClientDataCache, trackFarmClientCacheInvalidations } from \"./client-cache\";\nimport type { ServerQuery } from \"./server-query\";\nimport { isFarmServerQueryResult, type FarmServerQueryResult } from \"./server-query-protocol\";\n\nexport type ServerQueryFetchOptions = {\n  /** Used only when a non-Farm transport returns plain data. Farm transports use the declaration. */\n  staleTime?: number | false;\n  /** Return stale data immediately while refreshing it in the background. Default true. */\n  swr?: boolean;\n  /** Always wait for a new result. */\n  force?: boolean;\n};\n\nexport type FarmServerQueryActionInvocation = {\n  actionId: string;\n  args: readonly unknown[];\n  provisionalKey?: string;\n  owner?: object;\n};\n\ntype ActiveServerQueryInvocation = {\n  provisionalKey: string;\n  owner: object;\n};\n\ntype ServerQueryOwner = {\n  invalidations: ReturnType<typeof trackFarmClientCacheInvalidations>;\n  supersededKeys: Set<string>;\n};\n\ntype ServerQueryClientState = {\n  functionIds: WeakMap<Function, number>;\n  nextFunctionId: number;\n  active: ActiveServerQueryInvocation[];\n  latestOwners: Map<string, object>;\n  owners: Set<ServerQueryOwner>;\n};\n\nconst FARM_SERVER_QUERY_CLIENT_STATE = Symbol.for(\"farm.serverQueryClientState\");\nconst serverQueryClientGlobal = globalThis as typeof globalThis & {\n  [FARM_SERVER_QUERY_CLIENT_STATE]?: ServerQueryClientState;\n};\nconst serverQueryClientState: ServerQueryClientState = (serverQueryClientGlobal[\n  FARM_SERVER_QUERY_CLIENT_STATE\n] ??= {\n  functionIds: new WeakMap(),\n  nextFunctionId: 0,\n  active: [],\n  latestOwners: new Map(),\n  owners: new Set(),\n});\nserverQueryClientState.latestOwners ??= new Map();\nserverQueryClientState.owners ??= new Set();\n\nfunction isServerQueryOwnerSuperseded(owner: ServerQueryOwner, key: string): boolean {\n  const cache = getFarmClientDataCache();\n  const resolved = cache.resolveKey(key);\n  for (const superseded of owner.supersededKeys ?? []) {\n    if (cache.resolveKey(superseded) === resolved) return true;\n  }\n  return false;\n}\n\nfunction claimServerQueryKey(owner: ServerQueryOwner, key: string): boolean {\n  if (isServerQueryOwnerSuperseded(owner, key)) return false;\n  const resolved = getFarmClientDataCache().resolveKey(key);\n  // Set iteration follows request start order, not response timestamps. Record\n  // the claim on older live requests so it survives this owner's completion,\n  // even when an older reference only learns its canonical key afterward.\n  for (const older of serverQueryClientState.owners) {\n    if (older === owner) break;\n    older.supersededKeys.add(resolved);\n  }\n  return true;\n}\n\n// Global symbol registry key set on raw server query implementations by\n// createServerQuery. Referenced via Symbol.for instead of importing\n// server-query.ts, which would pull the server handler pipeline into the\n// client bundle.\nconst RAW_SERVER_QUERY_SYMBOL = Symbol.for(\"farm.server-query\");\n\n/**\n * A query reaching the browser should be a transformed server reference. The\n * raw implementation carries the server query symbol; executing it here would\n * run the server handler in the browser (#408). During SSR the raw\n * implementation is expected and runs directly.\n */\nfunction assertNotRawServerQueryInBrowser(query: unknown): void {\n  if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n  if (!(query as Record<symbol, unknown> | null)?.[RAW_SERVER_QUERY_SYMBOL]) return;\n  throw new Error(\n    [\n      \"useServerQuery received a raw server query implementation in the browser.\",\n      \"Server query handlers run only on the server. Enable the server-function transform (add @farm.js/plugin/rsc and set experimental.serverActions: true in farm.config.ts) so client imports become server references,\",\n      \"or call the query from server code / an API route (createAPIClient) instead.\",\n    ].join(\"\\n\"),\n  );\n}\n\nexport function beginFarmServerQueryAction(\n  actionId: string,\n  args: readonly unknown[],\n): FarmServerQueryActionInvocation {\n  const active = serverQueryClientState.active.at(-1);\n  return {\n    actionId,\n    args,\n    provisionalKey: active?.provisionalKey,\n    owner: active?.owner,\n  };\n}\n\nexport function completeFarmServerQueryAction<TData>(\n  invocation: FarmServerQueryActionInvocation,\n  value: TData | FarmServerQueryResult<TData>,\n): TData {\n  if (!isFarmServerQueryResult(value)) return value as TData;\n\n  const cache = getFarmClientDataCache();\n  const metadata = value.__farmServerQuery;\n  if (!shouldApplyFarmServerQueryActionResult(invocation)) {\n    return value.data as TData;\n  }\n  if (invocation.provisionalKey) {\n    cache.alias(invocation.provisionalKey, metadata.key);\n  }\n  const owner = invocation.owner as ServerQueryOwner | undefined;\n  if (\n    owner &&\n    serverQueryClientState.owners.has(owner) &&\n    !claimServerQueryKey(owner, metadata.key)\n  ) {\n    return value.data as TData;\n  }\n  const invalidated = (invocation.owner as ServerQueryOwner | undefined)?.invalidations?.has(\n    metadata.key,\n  );\n\n  cache.set(metadata.key, {\n    data: value.data,\n    updatedAt: metadata.updatedAt,\n    staleAt: invalidated\n      ? 0\n      : metadata.staleTime === false\n        ? Number.POSITIVE_INFINITY\n        : metadata.updatedAt + metadata.staleTime,\n    status: \"success\",\n    error: null,\n    fetching: false,\n    persist: metadata.persist === true ? true : undefined,\n  });\n\n  return value.data as TData;\n}\n\nexport function shouldApplyFarmServerQueryActionResult(\n  invocation: FarmServerQueryActionInvocation,\n): boolean {\n  if (!invocation.provisionalKey || !invocation.owner) return true;\n  return isCurrentServerQueryOwner(invocation.provisionalKey, invocation.owner);\n}\n\nfunction isCurrentServerQueryOwner(provisionalKey: string, owner: object): boolean {\n  return (\n    serverQueryClientState.latestOwners.get(provisionalKey) === owner &&\n    !isServerQueryOwnerSuperseded(owner as ServerQueryOwner, provisionalKey)\n  );\n}\n\nexport function createServerQueryCallKey<TInput, TData>(\n  query: ServerQuery<TInput, TData>,\n  input: TInput,\n): string {\n  let id = serverQueryClientState.functionIds.get(query);\n  if (!id) {\n    id = ++serverQueryClientState.nextFunctionId;\n    serverQueryClientState.functionIds.set(query, id);\n  }\n  return createFarmCacheKey([\"server-query-call\", id, input]);\n}\n\nexport async function fetchServerQuery<TInput, TData>(\n  query: ServerQuery<TInput, TData>,\n  input: TInput,\n  options: ServerQueryFetchOptions = {},\n): Promise<TData> {\n  const cache = getFarmClientDataCache();\n  const provisionalKey = createServerQueryCallKey(query, input);\n  const entry = cache.get<TData>(provisionalKey);\n  const stale = cache.isStale(provisionalKey);\n  const inflight = cache.getInflight<TData>(provisionalKey);\n\n  if (\n    !options.force &&\n    entry &&\n    stale &&\n    (entry.status !== \"pending\" || entry.updatedAt !== 0) &&\n    entry.status !== \"error\" &&\n    (options.swr ?? true)\n  ) {\n    // Every SWR reader can use the previous value, including while another\n    // reader owns the refresh. Initial pending reads still wait below.\n    if (!inflight) {\n      void executeServerQuery(query, input, provisionalKey, options).catch(() => undefined);\n    }\n    return entry.data;\n  }\n\n  if (inflight && !options.force) return inflight;\n  if (!options.force && entry && !stale && entry.status !== \"error\") return entry.data;\n\n  return executeServerQuery(query, input, provisionalKey, options);\n}\n\nexport function prefetchServerQuery<TInput, TData>(\n  query: ServerQuery<TInput, TData>,\n  input: TInput,\n  options: Omit<ServerQueryFetchOptions, \"force\"> = {},\n): Promise<TData> {\n  return fetchServerQuery(query, input, options);\n}\n\nasync function executeServerQuery<TInput, TData>(\n  query: ServerQuery<TInput, TData>,\n  input: TInput,\n  provisionalKey: string,\n  options: ServerQueryFetchOptions,\n): Promise<TData> {\n  assertNotRawServerQueryInBrowser(query);\n  const cache = getFarmClientDataCache();\n  const inflight = cache.getInflight<TData>(provisionalKey);\n  if (inflight && !options.force) return inflight;\n\n  const owner: ServerQueryOwner = {\n    invalidations: trackFarmClientCacheInvalidations(cache),\n    supersededKeys: new Set(),\n  };\n  serverQueryClientState.latestOwners.set(provisionalKey, owner);\n  serverQueryClientState.owners.add(owner);\n  claimServerQueryKey(owner, provisionalKey);\n\n  const previous = cache.get<TData>(provisionalKey);\n  cache.set(provisionalKey, {\n    data: previous?.data as TData,\n    updatedAt: previous?.updatedAt ?? 0,\n    staleAt: previous?.staleAt ?? 0,\n    gcAt: previous?.gcAt,\n    invalidatedAt: previous?.invalidatedAt,\n    status: \"pending\",\n    error: null,\n    fetching: true,\n  });\n\n  let promise!: Promise<TData>;\n  promise = (async () => {\n    // Let the promise be assigned and registered before a query implementation\n    // can throw synchronously and enter the cleanup path.\n    await Promise.resolve();\n    try {\n      serverQueryClientState.active.push({ provisionalKey, owner });\n      let pending: Promise<TData>;\n      try {\n        pending = query(input);\n      } finally {\n        serverQueryClientState.active.pop();\n      }\n\n      const data = await pending;\n      const transported = cache.get<TData>(provisionalKey);\n      if (\n        isCurrentServerQueryOwner(provisionalKey, owner) &&\n        (!transported || transported.fetching)\n      ) {\n        const updatedAt = Date.now();\n        cache.set(provisionalKey, {\n          data,\n          updatedAt,\n          staleAt: owner.invalidations.has(provisionalKey)\n            ? 0\n            : options.staleTime === false\n              ? Number.POSITIVE_INFINITY\n              : updatedAt + (options.staleTime ?? 0),\n          status: \"success\",\n          error: null,\n          fetching: false,\n        });\n      }\n      return data;\n    } catch (cause) {\n      const error = normalizeServerQueryError(cause);\n      if (isCurrentServerQueryOwner(provisionalKey, owner)) {\n        const current = cache.get<TData>(provisionalKey);\n        cache.set(provisionalKey, {\n          data: current?.data as TData,\n          updatedAt: current?.updatedAt ?? 0,\n          staleAt: current?.staleAt ?? 0,\n          gcAt: current?.gcAt,\n          invalidatedAt: current?.invalidatedAt,\n          status: \"error\",\n          error,\n          fetching: false,\n        });\n      }\n      throw error;\n    } finally {\n      const invalidated =\n        isCurrentServerQueryOwner(provisionalKey, owner) && owner.invalidations.has(provisionalKey);\n      owner.invalidations.dispose();\n      serverQueryClientState.owners.delete(owner);\n      owner.supersededKeys.clear();\n      if (cache.getInflight(provisionalKey) === promise) {\n        cache.deleteInflight(provisionalKey);\n      }\n      if (serverQueryClientState.latestOwners.get(provisionalKey) === owner) {\n        serverQueryClientState.latestOwners.delete(provisionalKey);\n      }\n      // Notify only after retiring old work: mounted consumers must start a new\n      // read, not rejoin the promise whose result has just been invalidated.\n      if (invalidated) cache.invalidate(provisionalKey);\n    }\n  })();\n\n  cache.setInflight(provisionalKey, promise);\n  return promise;\n}\n\nfunction normalizeServerQueryError(cause: unknown): Error {\n  if (cause instanceof Error) return cause;\n  const error = new Error(typeof cause === \"string\" ? cause : \"Server query failed\");\n  (error as Error & { cause?: unknown }).cause = cause;\n  return error;\n}\n","\"use client\";\n\nimport type {\n  FarmResolvedTheme,\n  FarmThemePreference,\n  FarmThemeRuntime,\n  FarmThemeSnapshot,\n} from \"./types\";\n\ndeclare global {\n  interface Window {\n    __FARM_THEME__?: FarmThemeRuntime;\n  }\n}\n\nconst FALLBACK_CLIENT_SNAPSHOT: FarmThemeSnapshot = Object.freeze({\n  theme: \"system\",\n  resolvedTheme: \"light\",\n  mounted: true,\n});\n\nlet cachedClientSnapshot = FALLBACK_CLIENT_SNAPSHOT;\n\nfunction snapshotsMatch(left: FarmThemeSnapshot, right: FarmThemeSnapshot): boolean {\n  return (\n    left.theme === right.theme &&\n    left.resolvedTheme === right.resolvedTheme &&\n    left.mounted === right.mounted\n  );\n}\n\nexport function getTheme(): FarmThemeSnapshot {\n  const next =\n    typeof window === \"undefined\" ? FALLBACK_CLIENT_SNAPSHOT : window.__FARM_THEME__?.snapshot;\n  if (!next) return cachedClientSnapshot;\n  if (!snapshotsMatch(cachedClientSnapshot, next)) cachedClientSnapshot = next;\n  return cachedClientSnapshot;\n}\n\nexport function setTheme(theme: FarmThemePreference): void {\n  const runtime = typeof window === \"undefined\" ? undefined : window.__FARM_THEME__;\n  if (!runtime) {\n    throw new Error(\"The FARMJS theme runtime is not enabled. Add `theme` to farm.config.ts.\");\n  }\n  runtime.setTheme(theme);\n}\n\nexport function toggleTheme(): FarmResolvedTheme {\n  const next = getTheme().resolvedTheme === \"dark\" ? \"light\" : \"dark\";\n  setTheme(next);\n  return next;\n}\n\nexport function subscribeTheme(listener: () => void): () => void {\n  if (typeof window === \"undefined\") return () => {};\n  const handleThemeChange = () => {\n    getTheme();\n    listener();\n  };\n  window.addEventListener(\"farm:themechange\", handleThemeChange);\n  return () => window.removeEventListener(\"farm:themechange\", handleThemeChange);\n}\n","import { localizeFarmPathname, resolveFarmLocalePath } from \"./routing\";\nimport { stripFarmBasePath } from \"../base-path\";\nimport type { FarmI18nLocaleSource, ResolvedFarmI18nConfig } from \"./types\";\n\nexport interface FarmLocaleResolution {\n  locale: string;\n  source: FarmI18nLocaleSource;\n  pathname: string;\n  redirect?: string;\n  persist: boolean;\n}\n\nexport function getFarmLocaleVaryHeaders(\n  config: ResolvedFarmI18nConfig,\n  resolution: FarmLocaleResolution,\n): string[] {\n  if (!config.enabled || resolution.source === \"url\") return [];\n\n  const headers: string[] = [];\n  if (config.detection.includes(\"cookie\")) headers.push(\"Cookie\");\n  if (config.detection.includes(\"accept-language\")) headers.push(\"Accept-Language\");\n  return headers;\n}\n\nexport function resolveFarmLocaleRequest(\n  request: Request,\n  config: ResolvedFarmI18nConfig,\n  options: { redirect?: boolean } = {},\n): FarmLocaleResolution {\n  const url = new URL(request.url);\n  if (!config.enabled) {\n    return {\n      locale: config.defaultLocale,\n      source: \"default\",\n      pathname: url.pathname,\n      persist: false,\n    };\n  }\n\n  const pathMatch = resolveFarmLocalePath(url.pathname, config);\n  if (pathMatch.explicit && pathMatch.locale) {\n    const canonicalPath = localizeFarmPathname(pathMatch.pathname, pathMatch.locale, config);\n    // The locale canonical is always trailing-slash-free, but the app's dedicated\n    // trailing-slash redirect owns that normalization. When the only difference is\n    // a trailing slash, defer to it: otherwise, under trailingSlash: true, the i18n\n    // redirect (strip) and the trailing-slash redirect (add) bounce a locale URL\n    // between 307 and 308 forever and every locale page becomes unreachable.\n    const differsOnlyByTrailingSlash =\n      canonicalPath !== url.pathname &&\n      (url.pathname.length > 1 ? url.pathname.replace(/\\/+$/, \"\") : url.pathname) === canonicalPath;\n    const redirect =\n      options.redirect !== false && canonicalPath !== url.pathname && !differsOnlyByTrailingSlash\n        ? `${canonicalPath}${url.search}${url.hash}`\n        : undefined;\n    return {\n      locale: pathMatch.locale,\n      source: \"url\",\n      pathname: pathMatch.pathname,\n      redirect,\n      // Locale-prefixed pages are canonical and can be cached publicly. Locale\n      // switchers persist the same choice before navigating in the browser.\n      persist: false,\n    };\n  }\n\n  const detected = detectLocale(request, config);\n  const shouldRedirect =\n    options.redirect !== false &&\n    !isInternalOrApiPath(stripFarmBasePath(url.pathname, config.basePath)) &&\n    config.routing !== \"none\" &&\n    (config.routing === \"prefix-always\" || detected.locale !== config.defaultLocale);\n\n  return {\n    locale: detected.locale,\n    source: detected.source,\n    pathname: pathMatch.pathname,\n    redirect: shouldRedirect\n      ? `${localizeFarmPathname(pathMatch.pathname, detected.locale, config)}${url.search}${url.hash}`\n      : undefined,\n    persist: detected.source !== \"default\",\n  };\n}\n\nexport function createFarmLocaleCookie(\n  locale: string,\n  config: Pick<ResolvedFarmI18nConfig, \"cookie\">,\n): string {\n  const cookie = config.cookie;\n  let value = `${encodeURIComponent(cookie.name)}=${encodeURIComponent(locale)}`;\n  value += `; Max-Age=${cookie.maxAge}`;\n  value += `; Path=${cookie.path}`;\n  value += `; SameSite=${capitalize(cookie.sameSite)}`;\n  if (cookie.secure) value += \"; Secure\";\n  return value;\n}\n\nexport function matchFarmLocale(\n  requested: string | null | undefined,\n  locales: readonly string[],\n): string | undefined {\n  if (!requested) return undefined;\n  let canonical: string;\n  try {\n    canonical = Intl.getCanonicalLocales(requested)[0]!;\n  } catch {\n    return undefined;\n  }\n\n  const exact = locales.find((locale) => locale.toLowerCase() === canonical.toLowerCase());\n  if (exact) return exact;\n\n  const language = canonical.split(\"-\")[0]?.toLowerCase();\n  const base = locales.find((locale) => locale.toLowerCase() === language);\n  if (base) return base;\n  return locales.find((locale) => locale.split(\"-\")[0]?.toLowerCase() === language);\n}\n\nfunction detectLocale(\n  request: Request,\n  config: ResolvedFarmI18nConfig,\n): { locale: string; source: FarmI18nLocaleSource } {\n  for (const signal of config.detection) {\n    if (signal === \"url\") continue;\n\n    if (signal === \"cookie\") {\n      const locale = matchFarmLocale(\n        readCookie(request.headers.get(\"cookie\"), config.cookie.name),\n        config.locales,\n      );\n      if (locale) return { locale, source: \"cookie\" };\n    }\n\n    if (signal === \"accept-language\") {\n      const locale = resolveAcceptLanguage(request.headers.get(\"accept-language\"), config.locales);\n      if (locale) return { locale, source: \"accept-language\" };\n    }\n  }\n\n  return { locale: config.defaultLocale, source: \"default\" };\n}\n\nfunction resolveAcceptLanguage(\n  header: string | null,\n  locales: readonly string[],\n): string | undefined {\n  if (!header) return undefined;\n\n  const byRange = new Map<string, { locale: string; quality: number; index: number }>();\n  for (const [index, entry] of header.split(\",\").entries()) {\n    const [rawLocale = \"\", ...parameters] = entry.trim().split(\";\");\n    const locale = rawLocale.trim();\n    if (!locale) continue;\n\n    let quality = 1;\n    for (const parameter of parameters) {\n      const [rawName, rawValue] = parameter.trim().split(\"=\", 2);\n      if (rawName?.trim().toLowerCase() !== \"q\") continue;\n      const value = rawValue?.trim() ?? \"\";\n      quality = /^(?:0(?:\\.\\d{0,3})?|1(?:\\.0{0,3})?)$/.test(value) ? Number(value) : 0;\n    }\n\n    const key = locale.toLowerCase();\n    const previous = byRange.get(key);\n    if (!previous || quality > previous.quality) {\n      byRange.set(key, { locale, quality, index: previous?.index ?? index });\n    }\n  }\n\n  const candidates = [...byRange.values()]\n    .filter((candidate) => candidate.quality > 0)\n    .sort((a, b) => b.quality - a.quality || a.index - b.index);\n  const explicitRanges = [...byRange.values()].filter(({ locale }) => locale !== \"*\");\n\n  for (const candidate of candidates) {\n    if (candidate.locale === \"*\") {\n      const wildcardMatch = locales.find(\n        (locale) =>\n          !explicitRanges.some((range) => matchFarmLocale(range.locale, [locale]) !== undefined),\n      );\n      if (wildcardMatch) return wildcardMatch;\n      continue;\n    }\n\n    const locale = matchFarmLocale(candidate.locale, locales);\n    if (locale) return locale;\n  }\n  return undefined;\n}\n\nfunction readCookie(header: string | null, name: string): string | undefined {\n  if (!header) return undefined;\n  for (const part of header.split(\";\")) {\n    const separator = part.indexOf(\"=\");\n    if (separator < 0) continue;\n    let key: string;\n    try {\n      key = decodeURIComponent(part.slice(0, separator).trim());\n    } catch {\n      continue;\n    }\n    if (key !== name) continue;\n    try {\n      return decodeURIComponent(part.slice(separator + 1).trim());\n    } catch {\n      return part.slice(separator + 1).trim();\n    }\n  }\n  return undefined;\n}\n\nfunction isInternalOrApiPath(pathname: string): boolean {\n  return (\n    pathname === \"/api\" ||\n    pathname.startsWith(\"/api/\") ||\n    pathname.startsWith(\"/__farm/\") ||\n    pathname.startsWith(\"/_farm/\")\n  );\n}\n\nfunction capitalize(value: string): string {\n  return value.charAt(0).toUpperCase() + value.slice(1);\n}\n"],"mappings":"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","names":["value","splitRoutePattern","context","initialTagCount","normalizePathname","normalizePathname","IntlMessageFormat","context","serialized","listeners","listeners"]}