{"version":3,"sources":["../../src/api/runtime.ts","../../src/server/request.ts","../../src/server/request-bridge.ts","../../src/cache-invalidation.ts","../../src/api/endpoint.ts","../../src/tracing.ts","../../src/observability.ts","../../src/cache.ts","../../src/api/transport.ts","../../src/routing/specificity.ts","../../src/server-http.ts","../../src/api/config.ts","../../src/api/server-path.ts","../../src/api/route-schema.ts","../../src/response-body.ts","../../src/api/route-shape.ts","../../src/api/route.ts","../../src/api/plugin-route-runtime.ts","../../src/api/route-pattern.ts"],"sourcesContent":["import { _runWithCurrentRequest } from \"../server/request\";\nimport {\n  decodeFarmCacheInvalidations,\n  encodeFarmCacheInvalidations,\n  FARM_CACHE_INVALIDATION_HEADER,\n} from \"../cache-invalidation\";\nimport { isEndpointFailure, type EndpointFailure } from \"./endpoint\";\nimport {\n  bufferFarmRequestBody,\n  createFarmRequestBodyErrorResponse,\n  DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT,\n} from \"../server-http\";\nimport { DEFAULT_FARM_API_BASE_PATH, normalizeFarmAPIBasePath } from \"./config\";\nimport { resolveFarmAPICanonicalPathname } from \"./server-path\";\nimport { parseRouteSchema } from \"./route-schema\";\nimport { omitFarmResponseBody } from \"../response-body\";\n\nexport { registerAPIRouteShape, type APIRouteShapeSource } from \"./route-shape\";\nexport { mergePluginAPIRoutes } from \"./plugin-route-runtime\";\n\nexport {\n  matchAPIRoute,\n  type APIRouteParams,\n  type APIRouteParamValue,\n  type APIRouteMatch,\n} from \"./route-pattern\";\nimport { matchAPIRoute, type APIRouteParams, type APIRouteMatch } from \"./route-pattern\";\ninterface APIRouteMethodTable {\n  methods: string[];\n  endpoints: Record<string, any>;\n}\n\nexport function resolveAPIRouteEndpoint(\n  route: APIRouteMethodTable,\n  method: string,\n): any | undefined {\n  const normalizedMethod = method.toUpperCase();\n  return (\n    route.endpoints[normalizedMethod] ??\n    (normalizedMethod === \"HEAD\" ? route.endpoints.GET : undefined)\n  );\n}\n\nexport function getAllowedAPIRouteMethods(route: APIRouteMethodTable): string[] {\n  const methods = [...route.methods];\n  const getIndex = methods.indexOf(\"GET\");\n  if (getIndex >= 0 && !methods.includes(\"HEAD\")) {\n    methods.splice(getIndex + 1, 0, \"HEAD\");\n  }\n  return methods;\n}\n\n/** Match canonical routes through a configurable same-origin public API path. */\nexport function matchAPIRouteAtBasePath<T extends { path: string }>(\n  routes: Map<string, T>,\n  pathname: string,\n  serverBasePath = DEFAULT_FARM_API_BASE_PATH,\n): APIRouteMatch<T> | null {\n  const directMatch = matchAPIRoute(routes, pathname);\n  if (directMatch) return directMatch;\n\n  const canonicalPathname = resolveFarmAPICanonicalPathname(pathname, serverBasePath);\n  return canonicalPathname === pathname ? null : matchAPIRoute(routes, canonicalPathname);\n}\n\n/** Test whether a pathname belongs to the configured local API surface. */\nexport function isFarmAPIPathname(\n  pathname: string,\n  serverBasePath = DEFAULT_FARM_API_BASE_PATH,\n): boolean {\n  const basePath = normalizeFarmAPIBasePath(serverBasePath);\n  return basePath !== \"/\" && (pathname === basePath || pathname.startsWith(`${basePath}/`));\n}\n\nexport async function invokeAPIRouteEndpoint(\n  endpoint: any,\n  request: Request,\n  params: APIRouteParams = {},\n  bodySizeLimit = DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT,\n): Promise<Response> {\n  try {\n    request = await bufferFarmRequestBody(request, bodySizeLimit);\n  } catch (error) {\n    const response = createFarmRequestBodyErrorResponse(error);\n    if (response) return response;\n    throw error;\n  }\n\n  const response = await _runWithCurrentRequest(request, () =>\n    invokeAPIRouteEndpointInContext(endpoint, request, params),\n  );\n\n  if (request.method.toUpperCase() !== \"HEAD\") {\n    return response;\n  }\n\n  return omitFarmResponseBody(response);\n}\n\nasync function invokeAPIRouteEndpointInContext(\n  endpoint: any,\n  request: Request,\n  params: APIRouteParams,\n): Promise<Response> {\n  const queryContentTypeError = validateQueryContentType(request);\n  if (queryContentTypeError) {\n    return queryContentTypeError;\n  }\n\n  // `createEndpoint` brands its parsed-context handler explicitly. Plain route\n  // exports always receive the Web Request regardless of their parameter name;\n  // inferring a calling convention from `Function#toString()` misclassified\n  // valid handlers named `context`, `ctx`, or using destructuring.\n  const farmHandler = endpoint.__handler || null;\n\n  if (!farmHandler) {\n    const result = await endpoint(request, {\n      params: Promise.resolve(params),\n    });\n    return normalizeRouteResponse(result);\n  }\n\n  const url = new URL(request.url);\n  // Repeated keys collect into arrays, the same representation the rest of the\n  // framework hands to routes, and the same helper this path already uses for\n  // urlencoded and multipart bodies. Spread back onto a normal object so an\n  // endpoint without a query schema still receives the object shape it did\n  // before; `entriesToObject` has already dropped the prototype-poisoning keys.\n  const query: Record<string, string | string[]> = {\n    ...searchParamsToObject(url.searchParams),\n  };\n\n  let body: any = undefined;\n  if (request.method.toUpperCase() !== \"GET\" && request.method.toUpperCase() !== \"HEAD\") {\n    const parsedBody = await readRequestBody(request);\n    if (parsedBody.error) return parsedBody.error;\n    body = parsedBody.body;\n  }\n\n  const headers = Object.fromEntries(request.headers.entries());\n  const types = endpoint.__types || {};\n\n  const queryValidation = await validateInput(types.query, query, \"Invalid query parameters\");\n  if (queryValidation instanceof Response) {\n    return queryValidation;\n  }\n\n  const bodyValidation = await validateInput(types.body, body, \"Invalid request body\");\n  if (bodyValidation instanceof Response) {\n    return bodyValidation;\n  }\n\n  const headersValidation = await validateInput(types.headers, headers, \"Invalid request headers\");\n  if (headersValidation instanceof Response) {\n    return headersValidation;\n  }\n\n  const paramsValidation = await validateInput(types.params, params, \"Invalid route parameters\");\n  if (paramsValidation instanceof Response) return paramsValidation;\n\n  const handlerContext = {\n    query: queryValidation,\n    body: bodyValidation,\n    headers: headersValidation,\n    request,\n    context: {},\n    params: paramsValidation,\n  };\n  let execution: {\n    result: unknown;\n    context: unknown;\n    handlerExecuted: boolean;\n    invalidations: readonly string[];\n  };\n  try {\n    execution =\n      typeof endpoint.__farmInvoke === \"function\"\n        ? await endpoint.__farmInvoke(handlerContext)\n        : {\n            result: await farmHandler(handlerContext),\n            context: handlerContext.context,\n            handlerExecuted: true,\n            invalidations: [],\n          };\n  } catch (error) {\n    if (isEndpointFailure(error)) {\n      return createEndpointFailureResponse(error);\n    }\n    throw error;\n  }\n\n  if (execution.handlerExecuted && endpoint.__output && !isWebResponse(execution.result)) {\n    try {\n      execution.result = await parseRouteSchema(endpoint.__output, execution.result);\n    } catch {\n      throw new Error(\"API route returned a value that does not match its output schema.\");\n    }\n  }\n  const response = normalizeRouteResponse(execution.result);\n  return attachEndpointInvalidations(response, execution.invalidations);\n}\n\nfunction validateQueryContentType(request: Request): Response | null {\n  if (request.method.toUpperCase() !== \"QUERY\" || request.headers.has(\"content-type\")) {\n    return null;\n  }\n\n  return new Response(\n    JSON.stringify({\n      error: \"Invalid QUERY request\",\n      message: \"QUERY requests must include a Content-Type header.\",\n    }),\n    {\n      status: 400,\n      headers: { \"Content-Type\": \"application/json\" },\n    },\n  );\n}\n\nexport function normalizeRouteResponse(result: unknown): Response {\n  if (isWebResponse(result)) {\n    return result;\n  }\n\n  if (result === undefined) {\n    return new Response(null, { status: 204 });\n  }\n\n  return new Response(JSON.stringify(result), {\n    status: 200,\n    headers: { \"Content-Type\": \"application/json\" },\n  });\n}\n\nexport function isWebResponse(value: unknown): value is Response {\n  return (\n    value instanceof Response ||\n    (typeof value === \"object\" &&\n      value !== null &&\n      \"headers\" in value &&\n      \"status\" in value &&\n      typeof (value as Response).arrayBuffer === \"function\")\n  );\n}\n\nfunction attachEndpointInvalidations(response: Response, keys: readonly string[]): Response {\n  const existing = decodeFarmCacheInvalidations(\n    response.headers.get(FARM_CACHE_INVALIDATION_HEADER),\n  );\n  const encoded = encodeFarmCacheInvalidations([...existing, ...keys]);\n  if (!encoded) return response;\n\n  const headers = new Headers(response.headers);\n  headers.set(FARM_CACHE_INVALIDATION_HEADER, encoded);\n  return new Response(response.body, {\n    status: response.status,\n    statusText: response.statusText,\n    headers,\n  });\n}\n\nexport function createEndpointFailureResponse(failure: EndpointFailure<string, unknown>): Response {\n  return new Response(\n    JSON.stringify({\n      error: {\n        code: failure.code,\n        message: failure.message,\n        data: failure.data,\n      },\n    }),\n    {\n      status: failure.status,\n      headers: {\n        \"cache-control\": \"no-store\",\n        \"content-type\": \"application/json\",\n      },\n    },\n  );\n}\n\ninterface RequestBodyParseResult {\n  body?: unknown;\n  error?: Response;\n}\n\nasync function readRequestBody(request: Request): Promise<RequestBodyParseResult> {\n  const contentType = request.headers.get(\"content-type\")?.split(\";\", 1)[0]?.trim().toLowerCase();\n\n  try {\n    if (contentType === \"multipart/form-data\") {\n      return { body: formDataToObject(await request.clone().formData()) };\n    }\n\n    const text = await request.clone().text();\n    if (!text) return { body: undefined };\n    if (contentType === \"application/x-www-form-urlencoded\") {\n      return { body: searchParamsToObject(new URLSearchParams(text)) };\n    }\n    if (contentType === \"application/json\" || contentType?.endsWith(\"+json\")) {\n      return { body: JSON.parse(text) };\n    }\n\n    // A body is only parsed as JSON when the request says it is JSON, or when it\n    // declares no type at all (the permissive path kept for non-browser callers\n    // that omit the header).\n    //\n    // Parsing a *declared* non-JSON type as JSON removed the barrier that keeps\n    // browsers from reaching this surface cross-origin: `text/plain`,\n    // `application/x-www-form-urlencoded`, and `multipart/form-data` are the\n    // CORS \"simple\" types that a cross-site page may send with credentials and\n    // without a preflight. Honouring the declared type means such a request no\n    // longer arrives as a parsed JSON object.\n    if (contentType === undefined) {\n      return { body: JSON.parse(text) };\n    }\n\n    return { body: undefined };\n  } catch {\n    if (contentType === \"application/json\" || contentType?.endsWith(\"+json\")) {\n      return {\n        error: new Response(\n          JSON.stringify({\n            error: \"Invalid request body\",\n            message: \"The request body is not valid JSON.\",\n          }),\n          {\n            status: 400,\n            headers: { \"Content-Type\": \"application/json\" },\n          },\n        ),\n      };\n    }\n    // The body format is unsupported or malformed. Schema validation below\n    // will turn the missing value into a typed 400 response when applicable.\n  }\n\n  return { body: undefined };\n}\n\nfunction formDataToObject(\n  formData: FormData,\n): Record<string, FormDataEntryValue | FormDataEntryValue[]> {\n  return entriesToObject(formData.entries());\n}\n\nfunction searchParamsToObject(searchParams: URLSearchParams): Record<string, string | string[]> {\n  return entriesToObject(searchParams.entries());\n}\n\nfunction entriesToObject<TValue>(\n  entries: IterableIterator<[string, TValue]>,\n): Record<string, TValue | TValue[]> {\n  const output: Record<string, TValue | TValue[]> = Object.create(null);\n  for (const [key, value] of entries) {\n    if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") continue;\n    const current = output[key];\n    if (current === undefined) {\n      output[key] = value;\n    } else if (Array.isArray(current)) {\n      current.push(value);\n    } else {\n      output[key] = [current, value];\n    }\n  }\n  return output;\n}\n\nasync function validateInput(\n  schema: any,\n  value: unknown,\n  error: string,\n): Promise<unknown | Response> {\n  if (!schema) return value;\n  try {\n    return await parseRouteSchema(schema, value);\n  } catch (validationError: any) {\n    return Response.json(\n      {\n        error,\n        details: (validationError.issues || validationError.errors || []).map((issue: any) => ({\n          path: issue.path,\n          message: issue.message,\n          code: issue.code,\n        })),\n      },\n      { status: 400 },\n    );\n  }\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { Readable } from \"node:stream\";\nimport type { FarmRequest } from \"../types\";\nimport { _setCurrentRequestResolver } from \"./request-bridge\";\n\nconst REQUEST_STORAGE_KEY = Symbol.for(\"@farm.js/core/request-storage\");\n\nfunction getRequestStore(): AsyncLocalStorage<Request> {\n  const runtime = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\n  const existing = runtime[REQUEST_STORAGE_KEY];\n  if (existing instanceof AsyncLocalStorage) {\n    return existing as AsyncLocalStorage<Request>;\n  }\n\n  const storage = new AsyncLocalStorage<Request>();\n  runtime[REQUEST_STORAGE_KEY] = storage;\n  return storage;\n}\n\nconst requestStore = getRequestStore();\n\n_setCurrentRequestResolver(() => requestStore.getStore());\n\nexport interface FarmRequestURLOptions {\n  origin?: string | URL;\n  trustProxy?: boolean;\n}\n\nexport function resolveFarmRequestURL(req: FarmRequest, options: FarmRequestURLOptions = {}): URL {\n  if (options.origin) {\n    return new URL(req.url || \"/\", options.origin);\n  }\n\n  const forwardedHost = options.trustProxy\n    ? firstForwardedHeaderValue(req.headers[\"x-forwarded-host\"])\n    : undefined;\n  const fallbackHost = firstForwardedHeaderValue(req.headers.host) || \"localhost\";\n  const forwardedProto = options.trustProxy\n    ? firstForwardedHeaderValue(req.headers[\"x-forwarded-proto\"])\n    : undefined;\n  const normalizedProto = forwardedProto?.toLowerCase();\n  const proto =\n    normalizedProto === \"https\" || normalizedProto === \"http\"\n      ? normalizedProto\n      : isEncryptedFarmRequest(req)\n        ? \"https\"\n        : \"http\";\n  return new URL(req.url || \"/\", resolveRequestOrigin(proto, forwardedHost, fallbackHost));\n}\n\nexport function createWebRequestFromFarmRequest(\n  req: FarmRequest,\n  options: FarmRequestURLOptions = {},\n): Request {\n  const fullUrl = resolveFarmRequestURL(req, options).toString();\n\n  const headers = new Headers();\n  for (const [key, value] of Object.entries(req.headers)) {\n    if (value == null) {\n      continue;\n    }\n\n    if (Array.isArray(value)) {\n      for (const item of value) {\n        headers.append(key, item);\n      }\n      continue;\n    }\n\n    headers.set(key, value);\n  }\n\n  const method = (req.method || \"GET\").toUpperCase();\n  const init: RequestInit & { duplex?: \"half\" } = {\n    method: req.method,\n    headers,\n  };\n\n  if (method !== \"GET\" && method !== \"HEAD\") {\n    init.body = Readable.toWeb(req) as ReadableStream<Uint8Array>;\n    init.duplex = \"half\";\n  }\n\n  return new Request(fullUrl, init);\n}\n\nfunction isEncryptedFarmRequest(req: FarmRequest): boolean {\n  return Boolean((req.socket as { encrypted?: boolean } | undefined)?.encrypted);\n}\n\nfunction firstForwardedHeaderValue(value: string | string[] | undefined): string | undefined {\n  const first = Array.isArray(value) ? value[0] : value;\n  const token = first?.split(\",\", 1)[0]?.trim();\n  return token || undefined;\n}\n\nfunction resolveRequestOrigin(proto: \"http\" | \"https\", host: string | undefined, fallback: string) {\n  for (const candidate of [host, fallback, \"localhost\"]) {\n    if (!candidate) continue;\n    if (/[\\s/?#@\\\\]/u.test(candidate)) continue;\n    try {\n      const url = new URL(`${proto}://${candidate}`);\n      if (url.username || url.password || url.pathname !== \"/\" || url.search || url.hash) continue;\n      return url.origin;\n    } catch {\n      // Try the next host instead of turning an untrusted proxy header into a 500.\n    }\n  }\n  return `${proto}://localhost`;\n}\n\nexport async function _runWithCurrentRequest<T>(\n  request: Request,\n  fn: () => Promise<T> | T,\n): Promise<T> {\n  return requestStore.run(request, fn);\n}\n\nexport function getCurrentRequest(): Request {\n  const request = requestStore.getStore();\n  if (!request) {\n    throw new Error(\n      \"No current request is available. getCurrentRequest() can only be used during server rendering.\",\n    );\n  }\n\n  return request;\n}\n\n// Some runtimes (StackBlitz WebContainers among them) lose AsyncLocalStorage\n// context across async boundaries mid-render. Callers whose feature can\n// degrade gracefully should use this instead of getCurrentRequest() so a\n// missing store never turns into a 500.\nexport function getCurrentRequestOrNull(): Request | null {\n  return requestStore.getStore() ?? null;\n}\n","type CurrentRequestResolver = () => Request | undefined;\n\nconst CURRENT_REQUEST_RESOLVER_KEY = Symbol.for(\"farm.currentRequestResolver\");\n\ntype GlobalWithCurrentRequestResolver = typeof globalThis & {\n  [CURRENT_REQUEST_RESOLVER_KEY]?: CurrentRequestResolver;\n};\n\nfunction getGlobalState(): GlobalWithCurrentRequestResolver {\n  return globalThis as GlobalWithCurrentRequestResolver;\n}\n\nexport function _setCurrentRequestResolver(resolver: CurrentRequestResolver | undefined): void {\n  getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY] = resolver;\n}\n\nexport function _resolveCurrentRequest(): Request | undefined {\n  return getGlobalState()[CURRENT_REQUEST_RESOLVER_KEY]?.();\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 { createEndpoint as betterCallEndpoint } from \"better-call\";\nimport { applyFarmCacheInvalidationTargets, type FarmCacheInvalidationTarget } from \"../cache\";\nimport { isMultipartSchema, type MultipartSchema, type TypedFormData } from \"./transport\";\nimport type { RouteSchema, RouteSchemaInput, RouteSchemaOutput } from \"./route-schema\";\n\n// Share the route factory's Zod and Standard Schema contract.\ntype AnySchema = RouteSchema;\n\ntype MaybePromise<T> = T | Promise<T>;\ntype Simplify<T> = { [TKey in keyof T]: T[TKey] } & {};\ntype UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (\n  value: infer TIntersection,\n) => void\n  ? TIntersection\n  : never;\n\n// Handlers receive parsed output; callers supply the schema input.\ntype InferOutput<T> = RouteSchemaOutput<T>;\n\ntype InferInput<T> = T extends { _input: infer I }\n  ? I\n  : T extends { \"~standard\": unknown }\n    ? RouteSchemaInput<T>\n    : T extends { parse: (data: infer I) => unknown }\n      ? I\n      : unknown;\n\ntype InferBodyInput<T> =\n  T extends MultipartSchema<AnySchema> ? TypedFormData<InferInput<T>> : InferInput<T>;\n\ntype InferHeadersOutput<T> = [T] extends [never]\n  ? Record<string, string>\n  : T extends AnySchema\n    ? InferOutput<T>\n    : Record<string, string>;\n\nexport type EndpointErrorSchema = AnySchema & { parse: (data: unknown) => unknown };\n\ntype EndpointErrorDefinitionBase<TStatus extends number> = {\n  status: TStatus;\n  /** Public message safe to expose to API callers. */\n  message?: string;\n};\n\nexport type EndpointErrorDefinition<\n  TSchema extends EndpointErrorSchema = EndpointErrorSchema,\n  TStatus extends number = number,\n> = EndpointErrorDefinitionBase<TStatus> &\n  (\n    | {\n        /** Schema for the public error payload exposed to API callers. */\n        data: TSchema;\n        schema?: never;\n      }\n    | {\n        data?: never;\n        /** @deprecated Use `data` for consistency with server functions. */\n        schema: TSchema;\n      }\n  );\n\nexport type EndpointErrorDefinitions = Record<\n  string,\n  EndpointErrorDefinition<EndpointErrorSchema, number>\n>;\n\ntype InferEndpointErrorSchema<TDefinition> = TDefinition extends {\n  data: infer TSchema extends AnySchema;\n}\n  ? TSchema\n  : TDefinition extends { schema: infer TSchema extends AnySchema }\n    ? TSchema\n    : never;\n\nexport type EndpointErrorContracts<TErrors extends EndpointErrorDefinitions> = {\n  [TCode in keyof TErrors]: {\n    data: InferOutput<InferEndpointErrorSchema<TErrors[TCode]>>;\n    status: TErrors[TCode][\"status\"];\n  };\n};\n\nexport type EndpointErrorHandler<TErrors extends EndpointErrorDefinitions> = <\n  TCode extends keyof TErrors & string,\n>(\n  code: TCode,\n  data: InferInput<InferEndpointErrorSchema<TErrors[TCode]>>,\n) => never;\n\n/** @deprecated Use `EndpointErrorHandler`. */\nexport type EndpointFail<TErrors extends EndpointErrorDefinitions> = EndpointErrorHandler<TErrors>;\n\nexport class EndpointFailure<TCode extends string = string, TData = unknown> extends Error {\n  readonly code: TCode;\n  readonly data: TData;\n  readonly status: number;\n\n  constructor(\n    code: TCode,\n    data: TData,\n    options: {\n      status: number;\n      message: string;\n    },\n  ) {\n    super(options.message);\n    this.name = \"EndpointFailure\";\n    this.code = code;\n    this.data = data;\n    this.status = options.status;\n  }\n}\n\nexport function isEndpointFailure(value: unknown): value is EndpointFailure<string, unknown> {\n  return value instanceof EndpointFailure;\n}\n\nexport type EndpointParamValue = string | string[];\nexport type EndpointParams = Record<string, EndpointParamValue>;\n\nexport type EndpointMiddlewareContext<\n  TContext extends object = {},\n  TBody = unknown,\n  TQuery = unknown,\n  THeaders = Record<string, string>,\n> = {\n  body: TBody;\n  query: TQuery;\n  headers: THeaders;\n  request: Request;\n  /** Context accumulated from middleware that ran earlier in the chain. */\n  context: Readonly<TContext>;\n  params: EndpointParams;\n};\n\nexport type EndpointMiddlewareResult<TProvidedContext extends object = object> =\n  | TProvidedContext\n  | true\n  | false\n  | Response;\n\n/** A plain async function. No wrapper or `next()` callback is required. */\nexport type EndpointMiddleware<\n  TProvidedContext extends object = object,\n  TContext extends object = {},\n  TBody = unknown,\n  TQuery = unknown,\n  THeaders = Record<string, string>,\n> = (\n  ctx: EndpointMiddlewareContext<TContext, TBody, TQuery, THeaders>,\n) => MaybePromise<EndpointMiddlewareResult<TProvidedContext>>;\n\nexport type AnyEndpointMiddleware = (ctx: EndpointMiddlewareContext<any, any, any, any>) => unknown;\n\nexport type EndpointInvalidationTarget = FarmCacheInvalidationTarget;\n\nexport type EndpointInvalidationContext<\n  TContext extends object = {},\n  TBody = unknown,\n  TQuery = unknown,\n  THeaders = Record<string, string>,\n> = EndpointMiddlewareContext<TContext, TBody, TQuery, THeaders> & {\n  /** The raw value returned by the endpoint handler. */\n  result: unknown;\n};\n\nexport type EndpointInvalidations<\n  TContext extends object = {},\n  TBody = unknown,\n  TQuery = unknown,\n  THeaders = Record<string, string>,\n> =\n  | readonly EndpointInvalidationTarget[]\n  | ((\n      context: EndpointInvalidationContext<TContext, TBody, TQuery, THeaders>,\n    ) => readonly EndpointInvalidationTarget[] | Promise<readonly EndpointInvalidationTarget[]>);\n\ntype ValidateEndpointMiddlewares<TMiddlewares extends readonly AnyEndpointMiddleware[]> = {\n  readonly [TIndex in keyof TMiddlewares]: TMiddlewares[TIndex] extends AnyEndpointMiddleware\n    ? [Awaited<ReturnType<TMiddlewares[TIndex]>>] extends [EndpointMiddlewareResult<object>]\n      ? TMiddlewares[TIndex]\n      : never\n    : never;\n};\n\ntype ContextFromMiddlewareResult<TResult> =\n  Exclude<TResult, Response | boolean> extends infer TContext\n    ? [TContext] extends [never]\n      ? {}\n      : TContext extends object\n        ? TContext\n        : {}\n    : {};\n\ntype ContextFromMiddleware<TMiddleware> = TMiddleware extends (...args: any[]) => infer TResult\n  ? ContextFromMiddlewareResult<Awaited<TResult>>\n  : {};\n\nexport type InferEndpointMiddlewareContext<\n  TMiddlewares extends readonly ((...args: any[]) => any)[],\n  TContext extends object = {},\n> = TMiddlewares extends readonly [infer TMiddleware, ...infer TRest]\n  ? TMiddleware extends (...args: any[]) => any\n    ? TRest extends readonly ((...args: any[]) => any)[]\n      ? InferEndpointMiddlewareContext<\n          TRest,\n          Simplify<TContext & ContextFromMiddleware<TMiddleware>>\n        >\n      : Simplify<TContext>\n    : Simplify<TContext>\n  : number extends TMiddlewares[\"length\"]\n    ? Simplify<TContext & UnionToIntersection<ContextFromMiddleware<TMiddlewares[number]>>>\n    : Simplify<TContext>;\n\nexport type EndpointOptions<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TMiddlewares extends readonly AnyEndpointMiddleware[] = readonly [],\n  TErrors extends EndpointErrorDefinitions = {},\n> = {\n  method?: \"GET\" | \"HEAD\" | \"QUERY\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\" | \"OPTIONS\";\n  body?: TBody;\n  query?: TQuery;\n  headers?: THeaders;\n  middleware?: TMiddlewares;\n  /**\n   * Cache keys, tags, and route paths made stale after a successful handler result.\n   * The resolver receives validated input and middleware context.\n   */\n  invalidates?: EndpointInvalidations<\n    InferEndpointMiddlewareContext<TMiddlewares>,\n    InferOutput<TBody>,\n    InferOutput<TQuery>,\n    InferHeadersOutput<THeaders>\n  >;\n  errors?: TErrors;\n  /** @deprecated Use plain functions in `middleware` for Farm endpoint middleware. */\n  use?: any[];\n};\n\nexport type EndpointHandler<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n  TContext extends object = {},\n  TErrors extends EndpointErrorDefinitions = {},\n> = (ctx: {\n  body: InferOutput<TBody>;\n  query: InferOutput<TQuery>;\n  headers: InferHeadersOutput<THeaders>;\n  request: Request;\n  context: Readonly<TContext>;\n  params: EndpointParams;\n  error: EndpointErrorHandler<TErrors>;\n  /** @deprecated Use `error`. */\n  fail: EndpointFail<TErrors>;\n}) => Promise<TResponse> | TResponse;\n\n// Type to represent an endpoint with its input/output types\nexport type TypedEndpoint<\n  TBody = never,\n  TQuery = never,\n  TResponse = any,\n  THeaders = Record<string, string>,\n  TErrors = never,\n  TBodyInput = TBody,\n  TQueryInput = TQuery,\n> = {\n  __types: {\n    body: TBody;\n    inputBody: TBodyInput;\n    query: TQuery;\n    inputQuery: TQueryInput;\n    headers: THeaders;\n    response: TResponse;\n    errors: TErrors;\n  };\n  __path?: string;\n  __method?: string;\n} & ((options?: { body?: TBodyInput; query?: TQueryInput }) => Promise<TResponse>);\n\ntype CreatedEndpoint<\n  TBody extends AnySchema,\n  TQuery extends AnySchema,\n  THeaders extends AnySchema,\n  TResponse,\n  TErrors extends EndpointErrorDefinitions = {},\n> = TypedEndpoint<\n  InferOutput<TBody>,\n  InferOutput<TQuery>,\n  Awaited<TResponse>,\n  InferHeadersOutput<THeaders>,\n  EndpointErrorContracts<TErrors>,\n  InferBodyInput<TBody>,\n  InferInput<TQuery>\n>;\n\ntype AnyEndpointOptions = EndpointOptions<\n  AnySchema,\n  AnySchema,\n  AnySchema,\n  readonly AnyEndpointMiddleware[],\n  EndpointErrorDefinitions\n>;\ntype EndpointBodyFromOptions<TOptions> = TOptions extends {\n  body: infer TBody extends AnySchema;\n}\n  ? TBody\n  : never;\ntype EndpointQueryFromOptions<TOptions> = TOptions extends {\n  query: infer TQuery extends AnySchema;\n}\n  ? TQuery\n  : never;\ntype EndpointHeadersFromOptions<TOptions> = TOptions extends {\n  headers: infer THeaders extends AnySchema;\n}\n  ? THeaders\n  : never;\ntype EndpointMiddlewaresFromOptions<TOptions> = TOptions extends {\n  middleware: infer TMiddlewares extends readonly AnyEndpointMiddleware[];\n}\n  ? TMiddlewares\n  : readonly [];\ntype EndpointErrorsFromOptions<TOptions> = TOptions extends {\n  errors: infer TErrors extends EndpointErrorDefinitions;\n}\n  ? TErrors\n  : {};\ntype MethodlessEndpointOptions = Omit<AnyEndpointOptions, \"method\">;\ntype EndpointHandlerFromOptions<TOptions, TResponse> = EndpointHandler<\n  EndpointBodyFromOptions<TOptions>,\n  EndpointQueryFromOptions<TOptions>,\n  EndpointHeadersFromOptions<TOptions>,\n  TResponse,\n  InferEndpointMiddlewareContext<EndpointMiddlewaresFromOptions<TOptions>>,\n  EndpointErrorsFromOptions<TOptions>\n>;\ntype ValidatedEndpointHandlerFromOptions<TOptions, TResponse> = EndpointHandlerFromOptions<\n  TOptions,\n  TResponse\n> &\n  (EndpointMiddlewaresFromOptions<TOptions> extends ValidateEndpointMiddlewares<\n    EndpointMiddlewaresFromOptions<TOptions>\n  >\n    ? unknown\n    : never);\ntype CreatedEndpointFromOptions<TOptions, TResponse> = CreatedEndpoint<\n  EndpointBodyFromOptions<TOptions>,\n  EndpointQueryFromOptions<TOptions>,\n  EndpointHeadersFromOptions<TOptions>,\n  TResponse,\n  EndpointErrorsFromOptions<TOptions>\n>;\n\n/**\n * Create a Farm.js API endpoint\n *\n * Supports two patterns:\n * 1. File-based routing (path auto-inferred from file location):\n *    `export const POST = createEndpoint({ method: 'POST', body: schema }, handler)`\n *    `createEndpoint({ method: 'GET', query: z.object({...}) }, handler)`\n *\n * 2. Explicit path (for routes.ts at project root):\n *    `createEndpoint('/api/hello', { method: 'GET', query: z.object({...}) }, handler)`\n */\nexport function createEndpoint<const TOptions extends AnyEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function createEndpoint<const TOptions extends AnyEndpointOptions, TResponse = any>(\n  path: string,\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function createEndpoint<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: EndpointOptions<TBody, TQuery, THeaders, readonly []>,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function createEndpoint<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  path: string,\n  options: EndpointOptions<TBody, TQuery, THeaders, readonly []>,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function createEndpoint(\n  pathOrOptions:\n    | string\n    | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[], EndpointErrorDefinitions>,\n  optionsOrHandler:\n    | EndpointOptions<any, any, any, readonly AnyEndpointMiddleware[], EndpointErrorDefinitions>\n    | EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n  maybeHandler?: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n): TypedEndpoint<any, any, any, any> {\n  // Determine if first arg is path or options\n  let path: string;\n  let options: EndpointOptions<\n    any,\n    any,\n    any,\n    readonly AnyEndpointMiddleware[],\n    EndpointErrorDefinitions\n  >;\n  let handler: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>;\n\n  if (typeof pathOrOptions === \"string\") {\n    // createEndpoint('/path', options, handler)\n    path = pathOrOptions;\n    options = optionsOrHandler as typeof options;\n    handler = maybeHandler as typeof handler;\n  } else {\n    // createEndpoint(options, handler) - path will be set by API plugin from file location\n    path = \"\";\n    options = pathOrOptions;\n    handler = optionsOrHandler as typeof handler;\n  }\n\n  if (typeof handler !== \"function\") {\n    throw new TypeError(\"createEndpoint requires a handler function\");\n  }\n\n  const middleware = normalizeEndpointMiddleware(options.middleware);\n  const errors = normalizeEndpointErrors(options.errors);\n  const error = createEndpointErrorHandler(errors);\n  const wrappedHandler = (async (ctx: EndpointMiddlewareContext<any, any, any, any>) => {\n    const execution = await runEndpointMiddleware(\n      middleware,\n      ctx,\n      handler,\n      error,\n      options.invalidates,\n    );\n    return execution.result;\n  }) as typeof handler;\n  const {\n    middleware: _middleware,\n    errors: _errors,\n    invalidates: _invalidates,\n    ...betterCallOptions\n  } = options;\n\n  // Create the endpoint - path will be set later by API plugin if not provided\n  // We use a temporary path that will be replaced when the router is created\n  const endpoint = betterCallEndpoint(\n    path || \"/__farm_auto_path__\",\n    betterCallOptions as any,\n    wrappedHandler as any,\n  ) as any;\n\n  // Store the path and type information on the endpoint for later access\n  // Empty/undefined path means it will be inferred from file location by the API plugin\n  endpoint.__path = path || undefined;\n  endpoint.__method = options.method || \"GET\";\n  endpoint.__autoPath = !path; // Flag to indicate path should be auto-inferred\n  endpoint.__handler = wrappedHandler; // Used by Farm's route runtime.\n  endpoint.__farmInvoke = (ctx: EndpointMiddlewareContext<any, any, any, any>) =>\n    runEndpointMiddleware(middleware, ctx, handler, error, options.invalidates);\n  endpoint.__middleware = middleware;\n  endpoint.__sourceHandler = handler;\n  endpoint.__invalidates = options.invalidates;\n  endpoint.__errors = errors;\n\n  // Store type information for inference\n  endpoint.__types = {\n    body: options.body,\n    inputBody: isMultipartSchema(options.body) ? \"form-data\" : options.body,\n    query: options.query,\n    inputQuery: options.query,\n    headers: options.headers,\n    response: null as any,\n    errors,\n  };\n\n  return endpoint as any;\n}\n\nconst EMPTY_ENDPOINT_MIDDLEWARE = Object.freeze([]) as readonly AnyEndpointMiddleware[];\nconst EMPTY_ENDPOINT_CONTEXT = Object.freeze(Object.create(null)) as Readonly<\n  Record<string | symbol, unknown>\n>;\nconst UNSAFE_ENDPOINT_CONTEXT_KEYS = new Set([\"__proto__\", \"constructor\", \"prototype\"]);\n\nfunction normalizeEndpointErrors(\n  definitions: EndpointErrorDefinitions | undefined,\n): Readonly<EndpointErrorDefinitions> {\n  if (definitions === undefined) return Object.freeze({});\n  if (!isPlainEndpointContext(definitions)) {\n    throw new TypeError(\"createEndpoint errors must be an object\");\n  }\n\n  const normalized: EndpointErrorDefinitions = Object.create(null);\n  for (const [code, definition] of Object.entries(definitions)) {\n    if (!code.trim()) {\n      throw new TypeError(\"Endpoint error codes cannot be empty\");\n    }\n    if (!definition || typeof definition !== \"object\") {\n      throw new TypeError(`Endpoint error \"${code}\" must be an object`);\n    }\n    if (\n      !Number.isInteger(definition.status) ||\n      definition.status < 400 ||\n      definition.status > 599\n    ) {\n      throw new TypeError(`Endpoint error \"${code}\" status must be an integer between 400 and 599`);\n    }\n    const dataSchema = resolveEndpointErrorSchema(definition);\n    if (!dataSchema || typeof dataSchema.parse !== \"function\") {\n      throw new TypeError(`Endpoint error \"${code}\" requires a data schema with parse()`);\n    }\n    if (definition.message !== undefined && typeof definition.message !== \"string\") {\n      throw new TypeError(`Endpoint error \"${code}\" message must be a string`);\n    }\n\n    normalized[code] = Object.freeze({ ...definition });\n  }\n\n  return Object.freeze(normalized);\n}\n\nfunction resolveEndpointErrorSchema(\n  definition: EndpointErrorDefinition<EndpointErrorSchema, number>,\n): EndpointErrorSchema | undefined {\n  if (definition.data && definition.schema) {\n    throw new TypeError(\"Endpoint errors cannot define both data and schema\");\n  }\n  return definition.data ?? definition.schema;\n}\n\nfunction createEndpointErrorHandler(\n  definitions: Readonly<EndpointErrorDefinitions>,\n): EndpointErrorHandler<EndpointErrorDefinitions> {\n  return ((code: string, data: unknown): never => {\n    const definition = definitions[code];\n    if (!definition) {\n      throw new TypeError(`Endpoint error \"${code}\" is not declared`);\n    }\n\n    const parsed = resolveEndpointErrorSchema(definition)!.parse(data);\n    throw new EndpointFailure(code, parsed, {\n      status: definition.status,\n      message: definition.message ?? \"Request failed\",\n    });\n  }) as EndpointErrorHandler<EndpointErrorDefinitions>;\n}\n\nfunction normalizeEndpointMiddleware(\n  middleware: readonly AnyEndpointMiddleware[] | undefined,\n): readonly AnyEndpointMiddleware[] {\n  if (middleware === undefined) return EMPTY_ENDPOINT_MIDDLEWARE;\n  if (!Array.isArray(middleware)) {\n    throw new TypeError(\"createEndpoint middleware must be an array of functions\");\n  }\n\n  const normalized = [...middleware];\n  for (const entry of normalized) {\n    if (typeof entry !== \"function\") {\n      throw new TypeError(\"createEndpoint middleware entries must be functions\");\n    }\n  }\n\n  return Object.freeze(normalized);\n}\n\nasync function runEndpointMiddleware(\n  middleware: readonly AnyEndpointMiddleware[],\n  handlerContext: EndpointMiddlewareContext<any, any, any, any>,\n  handler: EndpointHandler<any, any, any, any, any, EndpointErrorDefinitions>,\n  error: EndpointErrorHandler<EndpointErrorDefinitions>,\n  invalidations: EndpointInvalidations<any, any, any, any> | undefined,\n): Promise<{\n  result: unknown;\n  context: Readonly<Record<string | symbol, unknown>>;\n  handlerExecuted: boolean;\n  invalidations: readonly string[];\n}> {\n  let context = createInitialEndpointContext(handlerContext.context);\n\n  for (let index = 0; index < middleware.length; index++) {\n    const result = await middleware[index]({ ...handlerContext, context });\n\n    if (isEndpointResponse(result)) {\n      return {\n        result,\n        context,\n        handlerExecuted: false,\n        invalidations: [],\n      };\n    }\n    if (result === false) {\n      return {\n        result: forbiddenEndpointResponse(),\n        context,\n        handlerExecuted: false,\n        invalidations: [],\n      };\n    }\n    if (result === true) continue;\n\n    if (!isPlainEndpointContext(result)) {\n      throw new TypeError(\n        `Endpoint middleware ${index + 1} must return an object, true, false, or a Response`,\n      );\n    }\n\n    context = mergeEndpointContext(context, result, index);\n  }\n\n  const result = await handler({ ...handlerContext, context, error, fail: error });\n  return {\n    result,\n    context,\n    handlerExecuted: true,\n    invalidations: await applyEndpointInvalidations(\n      invalidations,\n      {\n        ...handlerContext,\n        context,\n        result,\n      },\n      result,\n    ),\n  };\n}\n\nasync function applyEndpointInvalidations(\n  declaration: EndpointInvalidations<any, any, any, any> | undefined,\n  context: EndpointInvalidationContext<any, any, any, any>,\n  result: unknown,\n): Promise<readonly string[]> {\n  if (!declaration || (isEndpointResponse(result) && result.status >= 400)) {\n    return [];\n  }\n\n  const targets = typeof declaration === \"function\" ? await declaration(context) : declaration;\n  if (!Array.isArray(targets)) {\n    throw new TypeError(\n      \"Endpoint invalidates must resolve to an array of { key }, { path }, or { tag } targets\",\n    );\n  }\n\n  return applyFarmCacheInvalidationTargets(targets);\n}\n\nfunction createInitialEndpointContext(value: unknown) {\n  if (value === undefined || value === null) return EMPTY_ENDPOINT_CONTEXT;\n  if (!isPlainEndpointContext(value)) {\n    throw new TypeError(\"Endpoint context must be a plain object\");\n  }\n\n  return mergeEndpointContext(EMPTY_ENDPOINT_CONTEXT, value);\n}\n\nfunction mergeEndpointContext(\n  current: Readonly<Record<string | symbol, unknown>>,\n  added: object,\n  middlewareIndex?: number,\n) {\n  const next = Object.assign(Object.create(null), current) as Record<string | symbol, unknown>;\n\n  for (const key of Reflect.ownKeys(added)) {\n    if (!Object.prototype.propertyIsEnumerable.call(added, key)) continue;\n    if (typeof key === \"string\" && UNSAFE_ENDPOINT_CONTEXT_KEYS.has(key)) {\n      throw new TypeError(`Endpoint middleware cannot provide the unsafe context key \"${key}\"`);\n    }\n    if (Object.prototype.hasOwnProperty.call(current, key)) {\n      const source =\n        middlewareIndex === undefined\n          ? \"Endpoint context\"\n          : `Endpoint middleware ${middlewareIndex + 1}`;\n      throw new TypeError(`${source} cannot replace the existing context key \"${String(key)}\"`);\n    }\n    next[key] = (added as Record<string | symbol, unknown>)[key];\n  }\n\n  return Object.freeze(next);\n}\n\nfunction isPlainEndpointContext(value: unknown): value is object {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n  const prototype = Object.getPrototypeOf(value);\n  return prototype === Object.prototype || prototype === null;\n}\n\nfunction isEndpointResponse(value: unknown): value is Response {\n  return (\n    value instanceof Response ||\n    (typeof value === \"object\" &&\n      value !== null &&\n      \"headers\" in value &&\n      \"status\" in value &&\n      typeof (value as Response).arrayBuffer === \"function\")\n  );\n}\n\nfunction forbiddenEndpointResponse() {\n  return new Response(JSON.stringify({ error: \"Forbidden\" }), {\n    status: 403,\n    headers: { \"Content-Type\": \"application/json\" },\n  });\n}\n\n/**\n * Convenience method for GET requests\n */\nexport function GET<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function GET<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function GET<\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<never, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<never, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<never, TQuery, THeaders, TResponse>;\nexport function GET(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"GET\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"GET\" }, args[1]);\n}\n\n/**\n * Convenience method for HEAD requests\n */\nexport function HEAD<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function HEAD<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function HEAD<\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<never, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<never, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<never, TQuery, THeaders, TResponse>;\nexport function HEAD(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"HEAD\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"HEAD\" }, args[1]);\n}\n\n/**\n * Convenience method for safe, idempotent QUERY requests with a request body\n */\nexport function QUERY<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function QUERY<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function QUERY<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function QUERY(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"QUERY\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"QUERY\" }, args[1]);\n}\n\n/**\n * Convenience method for POST requests\n */\nexport function POST<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function POST<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function POST<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function POST(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"POST\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"POST\" }, args[1]);\n}\n\n/**\n * Convenience method for PUT requests\n */\nexport function PUT<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function PUT<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function PUT<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function PUT(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"PUT\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"PUT\" }, args[1]);\n}\n\n/**\n * Convenience method for DELETE requests\n */\nexport function DELETE<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function DELETE<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function DELETE<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function DELETE(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"DELETE\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"DELETE\" }, args[1]);\n}\n\n/**\n * Convenience method for PATCH requests\n */\nexport function PATCH<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function PATCH<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function PATCH<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function PATCH(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"PATCH\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"PATCH\" }, args[1]);\n}\n\n/**\n * Convenience method for OPTIONS requests\n */\nexport function OPTIONS<T = any>(\n  handler: EndpointHandler<never, never, never, T>,\n): CreatedEndpoint<never, never, never, T>;\nexport function OPTIONS<const TOptions extends MethodlessEndpointOptions, TResponse = any>(\n  options: TOptions,\n  handler: ValidatedEndpointHandlerFromOptions<TOptions, TResponse>,\n): CreatedEndpointFromOptions<TOptions, TResponse>;\nexport function OPTIONS<\n  TBody extends AnySchema = never,\n  TQuery extends AnySchema = never,\n  THeaders extends AnySchema = never,\n  TResponse = any,\n>(\n  options: Omit<EndpointOptions<TBody, TQuery, THeaders, readonly []>, \"method\">,\n  handler: EndpointHandler<TBody, TQuery, THeaders, TResponse>,\n): CreatedEndpoint<TBody, TQuery, THeaders, TResponse>;\nexport function OPTIONS(...args: any[]): any {\n  if (args.length === 1) {\n    return createEndpoint(\"\", { method: \"OPTIONS\" }, args[0]);\n  }\n  return createEndpoint(\"\", { ...args[0], method: \"OPTIONS\" }, args[1]);\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","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","export type MultipartField = string | number | boolean | bigint | Blob | Date | null | undefined;\n\nexport type MultipartValues = Record<string, MultipartField | readonly MultipartField[]>;\n\n/**\n * A real FormData value that retains the submitted value shape for generated\n * API-client inference.\n */\nexport type TypedFormData<TValues> = FormData & {\n  readonly __farmMultipartInput: TValues;\n};\n\nexport type MultipartSchema<TSchema> = TSchema & {\n  readonly __farmMultipartSchema: true;\n};\n\nexport type FarmStreamResponse<TItem> = Response & {\n  readonly __farmStreamItem: TItem;\n};\n\nexport interface FarmAPIStream<TItem> extends AsyncIterable<TItem> {\n  readonly response: Response;\n  cancel(reason?: unknown): Promise<void>;\n}\n\ntype SchemaLike = {\n  parse(data: unknown): unknown;\n};\n\n/**\n * Mark a body schema as multipart. The handler still receives the schema's\n * parsed object; generated clients require `toFormData(...)` for the request.\n */\nexport function multipart<TSchema extends SchemaLike>(schema: TSchema): MultipartSchema<TSchema> {\n  if (!Object.isExtensible(schema) && !isMultipartSchema(schema)) {\n    throw new TypeError(\"multipart() requires an extensible schema object\");\n  }\n\n  if (!isMultipartSchema(schema)) {\n    Object.defineProperty(schema, \"__farmMultipartSchema\", {\n      value: true,\n      configurable: false,\n      enumerable: false,\n      writable: false,\n    });\n  }\n\n  return schema as MultipartSchema<TSchema>;\n}\n\nexport function isMultipartSchema(value: unknown): value is MultipartSchema<SchemaLike> {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    (value as { __farmMultipartSchema?: unknown }).__farmMultipartSchema === true &&\n    typeof (value as SchemaLike).parse === \"function\"\n  );\n}\n\n/**\n * Encode a typed object as multipart FormData without converting File or Blob\n * values to JSON or base64.\n */\nexport function toFormData<TValues extends MultipartValues>(\n  values: TValues,\n): TypedFormData<TValues> {\n  const formData = new FormData();\n\n  for (const [key, value] of Object.entries(values)) {\n    if (isUnsafeFormKey(key)) continue;\n    if (Array.isArray(value)) {\n      for (const entry of value) appendFormValue(formData, key, entry);\n      continue;\n    }\n    appendFormValue(formData, key, value as MultipartField);\n  }\n\n  return formData as TypedFormData<TValues>;\n}\n\n/**\n * Stream JSON values as newline-delimited JSON. Each source value becomes one\n * independently decodable item instead of buffering the whole response.\n */\nexport function jsonStream<TItem>(\n  source: AsyncIterable<TItem> | Iterable<TItem>,\n  init: ResponseInit = {},\n): FarmStreamResponse<TItem> {\n  const iterator = toAsyncIterator(source);\n  const encoder = new TextEncoder();\n  let finished = false;\n  let cleanup: Promise<unknown> | undefined;\n  const closeSource = (reason?: unknown) =>\n    (cleanup ??= Promise.resolve().then(() => iterator.return?.(reason)));\n\n  const body = new ReadableStream<Uint8Array>(\n    {\n      async pull(controller) {\n        if (finished) return;\n\n        try {\n          const next = await iterator.next();\n          if (finished) return;\n          if (next.done) {\n            finished = true;\n            controller.close();\n            return;\n          }\n          controller.enqueue(encoder.encode(`${JSON.stringify(next.value)}\\n`));\n        } catch (error) {\n          if (finished) return;\n          finished = true;\n          try {\n            await closeSource(error);\n          } catch {\n            // Preserve the serialization/source error that failed the response stream.\n          }\n          controller.error(error);\n        }\n      },\n      async cancel(reason) {\n        finished = true;\n        await closeSource(reason);\n      },\n    },\n    {\n      // Do not read the next application event until the response consumer\n      // requests another chunk.\n      highWaterMark: 0,\n    },\n  );\n  const headers = new Headers(init.headers);\n  if (!headers.has(\"content-type\")) {\n    headers.set(\"content-type\", \"application/x-ndjson; charset=utf-8\");\n  }\n  headers.set(\"cache-control\", headers.get(\"cache-control\") ?? \"no-store\");\n\n  return new Response(body, {\n    ...init,\n    headers,\n  }) as FarmStreamResponse<TItem>;\n}\n\nexport function isJSONStreamResponse(response: { headers?: Pick<Headers, \"get\"> | null }): boolean {\n  const contentType = response.headers?.get?.(\"content-type\")?.toLowerCase() ?? \"\";\n  return contentType.includes(\"application/x-ndjson\") || contentType.includes(\"application/ndjson\");\n}\n\n/**\n * Decode a Farm JSON stream lazily. The response body is read only as the\n * consumer advances the async iterator, preserving fetch backpressure.\n */\nexport function readJSONStream<TItem>(response: Response): FarmAPIStream<TItem> {\n  if (!response.body) {\n    throw new TypeError(\"Cannot read a JSON stream response without a body\");\n  }\n\n  const reader = response.body.getReader();\n  const decoder = new TextDecoder();\n  let buffer = \"\";\n  let completed = false;\n  let cancelled = false;\n  let claimed = false;\n  let released = false;\n\n  const releaseReader = () => {\n    if (released) return;\n    released = true;\n    reader.releaseLock();\n  };\n  const parseLine = async (line: string) => {\n    try {\n      return JSON.parse(line) as TItem;\n    } catch (error) {\n      completed = true;\n      buffer = \"\";\n      // A tee branch can wait for an unread sibling during cancellation. The\n      // parse failure is already known and must not wait for producer cleanup.\n      void reader.cancel(error).catch(() => {});\n      releaseReader();\n      throw error;\n    }\n  };\n\n  const readNext = async (): Promise<IteratorResult<TItem>> => {\n    while (true) {\n      if (cancelled) return { done: true, value: undefined };\n      const lineEnd = buffer.indexOf(\"\\n\");\n      if (lineEnd >= 0) {\n        const line = buffer.slice(0, lineEnd).trim();\n        buffer = buffer.slice(lineEnd + 1);\n        if (!line) continue;\n        return { done: false, value: await parseLine(line) };\n      }\n\n      if (completed) {\n        const line = buffer.trim();\n        buffer = \"\";\n        if (!line) {\n          releaseReader();\n          return { done: true, value: undefined };\n        }\n        return { done: false, value: await parseLine(line) };\n      }\n\n      let chunk: ReadableStreamReadResult<Uint8Array>;\n      try {\n        chunk = await reader.read();\n      } catch (error) {\n        if (cancelled) return { done: true, value: undefined };\n        completed = true;\n        buffer = \"\";\n        releaseReader();\n        throw error;\n      }\n      if (cancelled) return { done: true, value: undefined };\n      completed = chunk.done;\n      buffer += decoder.decode(chunk.value, { stream: !chunk.done });\n    }\n  };\n\n  let readQueue = Promise.resolve();\n  const iterator: AsyncIterator<TItem> = {\n    next() {\n      const result = readQueue.then(readNext);\n      // A failed read must not poison subsequent operations on this iterator.\n      readQueue = result.then(\n        () => {},\n        () => {},\n      );\n      return result;\n    },\n    async return() {\n      cancelled = true;\n      completed = true;\n      buffer = \"\";\n      if (!released) {\n        try {\n          await reader.cancel();\n        } finally {\n          releaseReader();\n        }\n      }\n      return { done: true, value: undefined };\n    },\n  };\n\n  return {\n    response,\n    async cancel(reason) {\n      // Cancellation must interrupt the active reader, not wait in its queue.\n      cancelled = true;\n      completed = true;\n      buffer = \"\";\n      if (!released) {\n        try {\n          await reader.cancel(reason);\n        } finally {\n          releaseReader();\n        }\n      }\n    },\n    [Symbol.asyncIterator]() {\n      if (claimed) {\n        throw new TypeError(\"Farm API streams can only be consumed once\");\n      }\n      claimed = true;\n      return iterator;\n    },\n  };\n}\n\nexport function isFarmAPIStream(value: unknown): value is FarmAPIStream<unknown> {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"response\" in value &&\n    typeof (value as FarmAPIStream<unknown>).cancel === \"function\" &&\n    typeof (value as FarmAPIStream<unknown>)[Symbol.asyncIterator] === \"function\"\n  );\n}\n\nfunction appendFormValue(formData: FormData, key: string, value: MultipartField): void {\n  if (value === undefined) return;\n  if (value === null) {\n    formData.append(key, \"\");\n    return;\n  }\n  if (value instanceof Blob) {\n    formData.append(key, value);\n    return;\n  }\n  if (value instanceof Date) {\n    formData.append(key, value.toISOString());\n    return;\n  }\n  formData.append(key, String(value));\n}\n\nfunction isUnsafeFormKey(key: string): boolean {\n  return key === \"__proto__\" || key === \"constructor\" || key === \"prototype\";\n}\n\nfunction toAsyncIterator<TItem>(\n  source: AsyncIterable<TItem> | Iterable<TItem>,\n): AsyncIterator<TItem> {\n  if (Symbol.asyncIterator in Object(source)) {\n    return (source as AsyncIterable<TItem>)[Symbol.asyncIterator]();\n  }\n\n  const iterator = (source as Iterable<TItem>)[Symbol.iterator]();\n  return {\n    next: async () => iterator.next(),\n    return: iterator.return ? async (value?: unknown) => iterator.return!(value) : undefined,\n  };\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 { assertBrowserStableRoutePath } from \"./routing/specificity\";\n\ninterface FarmNodeAbortRequest {\n  aborted?: boolean;\n  once(event: \"aborted\", listener: () => void): unknown;\n  off(event: \"aborted\", listener: () => void): unknown;\n}\n\ninterface FarmNodeAbortResponse {\n  writableEnded: boolean;\n  once(event: \"close\" | \"finish\", listener: () => void): unknown;\n  off(event: \"close\" | \"finish\", listener: () => void): unknown;\n}\n\n/** Share disconnect semantics between development and production Node requests. */\nexport function createFarmNodeRequestAbortSignal(\n  req: FarmNodeAbortRequest,\n  res: FarmNodeAbortResponse,\n): AbortSignal {\n  const controller = new AbortController();\n  let disposed = false;\n  const dispose = () => {\n    if (disposed) return;\n    disposed = true;\n    req.off(\"aborted\", abort);\n    res.off(\"close\", abortOnEarlyClose);\n    res.off(\"finish\", dispose);\n    controller.signal.removeEventListener(\"abort\", dispose);\n  };\n  const abort = () => controller.abort();\n  const abortOnEarlyClose = () => {\n    if (!res.writableEnded) abort();\n    dispose();\n  };\n\n  if (req.aborted) {\n    controller.abort();\n    return controller.signal;\n  }\n\n  req.once(\"aborted\", abort);\n  res.once(\"close\", abortOnEarlyClose);\n  res.once(\"finish\", dispose);\n  controller.signal.addEventListener(\"abort\", dispose, { once: true });\n  return controller.signal;\n}\n\nexport const DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT = 10_000_000;\nexport const DEFAULT_FARM_SERVER_HEADERS_TIMEOUT = 60_000;\nexport const DEFAULT_FARM_SERVER_REQUEST_TIMEOUT = 300_000;\nexport const DEFAULT_FARM_SERVER_KEEP_ALIVE_TIMEOUT = 5_000;\nexport const DEFAULT_FARM_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT = 30_000;\nconst MAX_FARM_SERVER_TIMEOUT = 2_147_483_647;\n\nexport type FarmServerDuration = number | `${number}${\"ms\" | \"s\" | \"m\" | \"h\"}`;\n\nexport interface FarmServerHealthConfig {\n  /** Liveness endpoint. It remains healthy while a production process drains. */\n  livenessPath?: string;\n  /** Readiness endpoint. It returns 503 until startup completes and while draining. */\n  readinessPath?: string;\n}\n\nexport interface ResolvedFarmServerHealthConfig {\n  enabled: boolean;\n  livenessPath: string;\n  readinessPath: string;\n}\n\nexport interface FarmServerConfig {\n  /** Maximum request body size for API routes, integrations, workflows, and uploads. */\n  bodySizeLimit?: number | string;\n  /** Trust proxy-provided client address and request authority headers. Enable only behind a trusted proxy. */\n  trustProxy?: boolean;\n  /** Maximum time for a Node client to send complete request headers. */\n  headersTimeout?: FarmServerDuration;\n  /** Maximum time for a Node client to send the complete request. */\n  requestTimeout?: FarmServerDuration;\n  /** How long an idle Node keep-alive connection remains open after a response. */\n  keepAliveTimeout?: FarmServerDuration;\n  /** Maximum time the Node adapter drains traffic before forcing shutdown. */\n  gracefulShutdownTimeout?: FarmServerDuration;\n  /** Production liveness and readiness endpoints. Set to false to disable them. */\n  health?: false | FarmServerHealthConfig;\n}\n\nexport interface ResolvedFarmServerConfig {\n  bodySizeLimit: number;\n  trustProxy: boolean;\n  headersTimeout: number;\n  requestTimeout: number;\n  keepAliveTimeout: number;\n  gracefulShutdownTimeout: number;\n  health: ResolvedFarmServerHealthConfig;\n}\n\nexport type FarmRequestBodyErrorCode = \"BODY_TOO_LARGE\" | \"INVALID_CONTENT_LENGTH\";\n\n/** Apply the weak entity-tag comparison required by If-None-Match. */\nexport function matchesFarmIfNoneMatch(\n  value: string | readonly string[] | null | undefined,\n  etag: string,\n): boolean {\n  const expected = parseEntityTag(trimOptionalWhitespace(etag));\n  if (!expected) return false;\n\n  const values = Array.isArray(value) ? value : [value];\n  const combined = values\n    .filter((header): header is string => typeof header === \"string\")\n    .join(\",\");\n  const fieldValue = trimOptionalWhitespace(combined);\n  if (!fieldValue) return false;\n  if (fieldValue === \"*\") return true;\n\n  let matched = false;\n  let hasEntityTag = false;\n  for (const candidate of splitEntityTags(fieldValue)) {\n    const token = trimOptionalWhitespace(candidate);\n    if (!token) continue;\n\n    const parsed = parseEntityTag(token);\n    if (!parsed) return false;\n    hasEntityTag = true;\n    if (parsed === expected) matched = true;\n  }\n\n  return hasEntityTag && matched;\n}\n\nfunction trimOptionalWhitespace(value: string): string {\n  return value.replace(/^[\\t ]+|[\\t ]+$/g, \"\");\n}\n\nfunction parseEntityTag(value: string): string | null {\n  const opaqueTag = value.startsWith(\"W/\") ? value.slice(2) : value;\n  if (opaqueTag.length < 2 || opaqueTag[0] !== '\"' || opaqueTag.at(-1) !== '\"') return null;\n\n  for (let index = 1; index < opaqueTag.length - 1; index++) {\n    const code = opaqueTag.charCodeAt(index);\n    if (code === 0x21 || (code >= 0x23 && code <= 0x7e) || code >= 0x80) continue;\n    return null;\n  }\n\n  return opaqueTag;\n}\n\nfunction splitEntityTags(value: string): string[] {\n  const tags: string[] = [];\n  let start = 0;\n  let quoted = false;\n\n  for (let index = 0; index < value.length; index++) {\n    const character = value[index];\n    if (character === '\"') {\n      quoted = !quoted;\n    } else if (character === \",\" && !quoted) {\n      tags.push(value.slice(start, index));\n      start = index + 1;\n    }\n  }\n\n  tags.push(value.slice(start));\n  return tags;\n}\n\nexport class FarmRequestBodyError extends Error {\n  readonly code: FarmRequestBodyErrorCode;\n  readonly status: number;\n\n  constructor(code: FarmRequestBodyErrorCode, status: number, message: string) {\n    super(message);\n    this.name = \"FarmRequestBodyError\";\n    this.code = code;\n    this.status = status;\n  }\n}\n\nexport function resolveFarmServerConfig(\n  config: FarmServerConfig | ResolvedFarmServerConfig | undefined,\n): ResolvedFarmServerConfig {\n  const headersTimeout = parseFarmServerDuration(\n    config?.headersTimeout ?? DEFAULT_FARM_SERVER_HEADERS_TIMEOUT,\n    \"server.headersTimeout\",\n  );\n  const requestTimeout = parseFarmServerDuration(\n    config?.requestTimeout ?? DEFAULT_FARM_SERVER_REQUEST_TIMEOUT,\n    \"server.requestTimeout\",\n  );\n  if (headersTimeout > requestTimeout) {\n    throw new TypeError(\"server.headersTimeout must not exceed server.requestTimeout\");\n  }\n\n  return Object.freeze({\n    bodySizeLimit: parseBodySizeLimit(\n      config?.bodySizeLimit ?? DEFAULT_FARM_SERVER_BODY_SIZE_LIMIT,\n      \"server.bodySizeLimit\",\n    ),\n    trustProxy: config?.trustProxy === true,\n    headersTimeout,\n    requestTimeout,\n    keepAliveTimeout: parseFarmServerDuration(\n      config?.keepAliveTimeout ?? DEFAULT_FARM_SERVER_KEEP_ALIVE_TIMEOUT,\n      \"server.keepAliveTimeout\",\n    ),\n    gracefulShutdownTimeout: parseFarmServerDuration(\n      config?.gracefulShutdownTimeout ?? DEFAULT_FARM_SERVER_GRACEFUL_SHUTDOWN_TIMEOUT,\n      \"server.gracefulShutdownTimeout\",\n    ),\n    health: resolveFarmServerHealthConfig(config?.health),\n  });\n}\n\nexport function parseFarmServerDuration(\n  value: FarmServerDuration,\n  optionName = \"duration\",\n): number {\n  if (typeof value === \"number\") {\n    if (!Number.isSafeInteger(value) || value <= 0) {\n      throw new TypeError(`${optionName} must be a positive safe integer`);\n    }\n    if (value > MAX_FARM_SERVER_TIMEOUT) {\n      throw new TypeError(`${optionName} must not exceed ${MAX_FARM_SERVER_TIMEOUT} milliseconds`);\n    }\n    return value;\n  }\n\n  const match = value\n    .trim()\n    .toLowerCase()\n    .match(/^(\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h)$/);\n  if (!match) {\n    throw new TypeError(`${optionName} must be milliseconds or a duration such as \"30s\" or \"2m\"`);\n  }\n\n  const amount = Number(match[1]);\n  const unit = match[2];\n  const multiplier = unit === \"ms\" ? 1 : unit === \"s\" ? 1_000 : unit === \"m\" ? 60_000 : 3_600_000;\n  const milliseconds = Math.floor(amount * multiplier);\n  if (!Number.isSafeInteger(milliseconds) || milliseconds <= 0) {\n    throw new TypeError(`${optionName} must resolve to a positive safe integer`);\n  }\n  if (milliseconds > MAX_FARM_SERVER_TIMEOUT) {\n    throw new TypeError(`${optionName} must not exceed ${MAX_FARM_SERVER_TIMEOUT} milliseconds`);\n  }\n  return milliseconds;\n}\n\nfunction resolveFarmServerHealthConfig(\n  config: false | FarmServerHealthConfig | ResolvedFarmServerHealthConfig | undefined,\n): ResolvedFarmServerHealthConfig {\n  if (config === false || (config && \"enabled\" in config && config.enabled === false)) {\n    return Object.freeze({\n      enabled: false,\n      livenessPath: \"/_farm/health/live\",\n      readinessPath: \"/_farm/health/ready\",\n    });\n  }\n\n  const livenessPath = normalizeHealthPath(\n    config?.livenessPath ?? \"/_farm/health/live\",\n    \"server.health.livenessPath\",\n  );\n  const readinessPath = normalizeHealthPath(\n    config?.readinessPath ?? \"/_farm/health/ready\",\n    \"server.health.readinessPath\",\n  );\n  if (livenessPath === readinessPath) {\n    throw new TypeError(\"server.health livenessPath and readinessPath must be different\");\n  }\n\n  return Object.freeze({ enabled: true, livenessPath, readinessPath });\n}\n\nfunction normalizeHealthPath(value: string, optionName: string): string {\n  const path = value.trim();\n  if (!path.startsWith(\"/\") || path.includes(\"?\") || path.includes(\"#\") || path.includes(\"*\")) {\n    throw new TypeError(`${optionName} must be an absolute pathname without a query or wildcard`);\n  }\n  const normalized = path.length > 1 ? path.replace(/\\/+$/, \"\") || \"/\" : path;\n  assertBrowserStableRoutePath(normalized);\n  return normalized;\n}\n\nexport function parseBodySizeLimit(value: number | string, optionName = \"bodySizeLimit\"): number {\n  if (typeof value === \"number\") {\n    if (!Number.isSafeInteger(value) || value <= 0) {\n      throw new TypeError(`${optionName} must be a positive safe integer`);\n    }\n    return value;\n  }\n\n  const match = value\n    .trim()\n    .toLowerCase()\n    .match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|kib|mib|gib)?$/);\n  if (!match) {\n    throw new TypeError(`${optionName} must be bytes or a size string such as \"500kb\" or \"10mb\"`);\n  }\n\n  const amount = Number(match[1]);\n  const unit = match[2] ?? \"b\";\n  const multiplier: Record<string, number> = {\n    b: 1,\n    kb: 1_000,\n    mb: 1_000_000,\n    gb: 1_000_000_000,\n    kib: 1_024,\n    mib: 1_048_576,\n    gib: 1_073_741_824,\n  };\n  const bytes = Math.floor(amount * multiplier[unit]);\n\n  if (!Number.isSafeInteger(bytes) || bytes <= 0) {\n    throw new TypeError(`${optionName} must resolve to a positive safe integer`);\n  }\n\n  return bytes;\n}\n\nexport async function bufferFarmRequestBody(request: Request, limit: number): Promise<Request> {\n  if (request.method === \"GET\" || request.method === \"HEAD\" || request.body === null) {\n    return request;\n  }\n\n  const bytes = await readFarmRequestBody(request, limit);\n  const body = new Uint8Array(bytes.byteLength);\n  body.set(bytes);\n  return new Request(request, {\n    // oxlint-disable-next-line unicorn/no-invalid-fetch-options -- GET and HEAD return above.\n    body: body.buffer,\n  });\n}\n\nexport async function readFarmRequestBody(request: Request, limit: number): Promise<Uint8Array> {\n  try {\n    validateContentLength(request.headers.get(\"content-length\"), limit);\n  } catch (error) {\n    // A cloned Request is a tee branch: its cancellation may wait for the\n    // untouched branch. Rejection must not wait for producer-owned cleanup.\n    void request.body?.cancel(error).catch(() => {});\n    throw error;\n  }\n  throwIfAborted(request.signal);\n  if (!request.body) return new Uint8Array();\n\n  const reader = request.body.getReader();\n  const chunks: Uint8Array[] = [];\n  let total = 0;\n  const cancelBodyRead = () => {\n    void reader.cancel(request.signal.reason).catch(() => {});\n  };\n  request.signal.addEventListener(\"abort\", cancelBodyRead, { once: true });\n\n  try {\n    while (true) {\n      throwIfAborted(request.signal);\n      const { done, value } = await reader.read();\n      // Cancellation resolves a pending read as EOF, not necessarily an error.\n      throwIfAborted(request.signal);\n      if (done) break;\n      if (!value) continue;\n\n      total += value.byteLength;\n      if (total > limit) {\n        const error = new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\");\n        void reader.cancel(error).catch(() => {});\n        throw error;\n      }\n      chunks.push(value);\n    }\n  } catch (error) {\n    if (request.signal.aborted) throwIfAborted(request.signal);\n    throw error;\n  } finally {\n    request.signal.removeEventListener(\"abort\", cancelBodyRead);\n    reader.releaseLock();\n  }\n\n  const body = new Uint8Array(total);\n  let offset = 0;\n  for (const chunk of chunks) {\n    body.set(chunk, offset);\n    offset += chunk.byteLength;\n  }\n  return body;\n}\n\nexport async function readNodeRequestBody(\n  request: {\n    headers: Record<string, string | string[] | undefined>;\n    on(event: \"data\", listener: (chunk: unknown) => void): unknown;\n    on(event: \"end\", listener: () => void): unknown;\n    on(event: \"error\", listener: (error: Error) => void): unknown;\n    removeListener?(event: string, listener: (...args: any[]) => void): unknown;\n    resume?(): unknown;\n  },\n  limit: number,\n): Promise<Buffer> {\n  const rawContentLength = request.headers[\"content-length\"];\n  const contentLength = Array.isArray(rawContentLength) ? rawContentLength[0] : rawContentLength;\n  try {\n    validateContentLength(contentLength, limit);\n  } catch (error) {\n    request.resume?.();\n    throw error;\n  }\n\n  return await new Promise<Buffer>((resolve, reject) => {\n    const chunks: Buffer[] = [];\n    let total = 0;\n    let settled = false;\n\n    const cleanup = () => {\n      request.removeListener?.(\"data\", onData);\n      request.removeListener?.(\"end\", onEnd);\n      request.removeListener?.(\"error\", onError);\n    };\n    const rejectOnce = (error: Error) => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      request.resume?.();\n      reject(error);\n    };\n    const onData = (chunk: unknown) => {\n      const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as any);\n      total += bytes.byteLength;\n      if (total > limit) {\n        rejectOnce(new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\"));\n        return;\n      }\n      chunks.push(bytes);\n    };\n    const onEnd = () => {\n      if (settled) return;\n      settled = true;\n      cleanup();\n      resolve(Buffer.concat(chunks, total));\n    };\n    const onError = (error: Error) => rejectOnce(error);\n\n    request.on(\"data\", onData);\n    request.on(\"end\", onEnd);\n    request.on(\"error\", onError);\n  });\n}\n\nexport function createFarmRequestBodyErrorResponse(error: unknown): Response | null {\n  if (!(error instanceof FarmRequestBodyError)) return null;\n\n  return new Response(error.status === 413 ? \"Payload Too Large\" : \"Bad Request\", {\n    status: error.status,\n    headers: {\n      \"cache-control\": \"no-store\",\n      \"content-type\": \"text/plain; charset=utf-8\",\n      \"x-content-type-options\": \"nosniff\",\n    },\n  });\n}\n\nfunction validateContentLength(value: string | null | undefined, limit: number): void {\n  const contentLength = value?.trim();\n  if (!contentLength) return;\n  if (!/^\\d+$/.test(contentLength)) {\n    throw new FarmRequestBodyError(\"INVALID_CONTENT_LENGTH\", 400, \"Invalid content-length header\");\n  }\n  if (Number(contentLength) > limit) {\n    throw new FarmRequestBodyError(\"BODY_TOO_LARGE\", 413, \"Request body is too large\");\n  }\n}\n\nfunction throwIfAborted(signal: AbortSignal): void {\n  if (!signal.aborted) return;\n  if (signal.reason !== undefined) throw signal.reason;\n  throw new DOMException(\"The operation was aborted\", \"AbortError\");\n}\n","import type { ResolvedFarmEnv } from \"../env\";\n\nexport const DEFAULT_FARM_API_BASE_PATH = \"/api\";\n\nexport interface FarmAPIConfigResolverContext {\n  root: string;\n  mode: \"development\" | \"production\";\n  env: ResolvedFarmEnv;\n}\n\nexport type FarmAPIConfigValue =\n  | string\n  | undefined\n  | ((context: FarmAPIConfigResolverContext) => string | undefined | Promise<string | undefined>);\n\nexport interface FarmAPIConfig {\n  /**\n   * Public API root. An origin-only URL is joined with `basePath`; a URL that\n   * already has a path is used as-is. May be resolved from deployment context.\n   */\n  baseURL?: FarmAPIConfigValue;\n  /** Public API path and same-origin server mount used when `baseURL` has no path. @default \"/api\" */\n  basePath?: FarmAPIConfigValue;\n}\n\nexport interface ResolvedFarmAPIConfig {\n  /** Fully resolved public API root, either absolute or root-relative. */\n  baseURL: string;\n  /** Effective pathname of `baseURL`. */\n  basePath: string;\n}\n\ndeclare const __FARM_API_BASE_URL__: string | undefined;\n\nexport async function resolveFarmAPIConfig(\n  config: FarmAPIConfig | undefined,\n  context: FarmAPIConfigResolverContext,\n): Promise<ResolvedFarmAPIConfig> {\n  const configuredBasePath = await resolveConfigValue(config?.basePath, context, \"api.basePath\");\n  const basePath = normalizeFarmAPIBasePath(configuredBasePath ?? DEFAULT_FARM_API_BASE_PATH);\n  const configuredBaseURL = await resolveConfigValue(config?.baseURL, context, \"api.baseURL\");\n\n  return normalizeFarmAPIConfig({ baseURL: configuredBaseURL, basePath });\n}\n\n/** Normalize already-resolved API strings. */\nexport function normalizeFarmAPIConfig(\n  config: { baseURL?: string; basePath?: string } | undefined,\n): ResolvedFarmAPIConfig {\n  const basePath = normalizeFarmAPIBasePath(config?.basePath ?? DEFAULT_FARM_API_BASE_PATH);\n  const baseURL = config?.baseURL?.trim();\n\n  if (!baseURL) {\n    return { baseURL: basePath, basePath };\n  }\n\n  if (baseURL.startsWith(\"//\")) {\n    throw new Error(\n      'Farm api.baseURL must be an absolute URL or a root-relative path such as \"/api\", not a network-path reference.',\n    );\n  }\n\n  if (baseURL.startsWith(\"/\")) {\n    const url = parseRootRelativeBaseURL(baseURL);\n    if (url.pathname !== \"/\") {\n      const effectivePath = normalizeFarmAPIBasePath(url.pathname);\n      return { baseURL: effectivePath, basePath: effectivePath };\n    }\n    return { baseURL: basePath, basePath };\n  }\n\n  let url: URL;\n  try {\n    url = new URL(baseURL);\n  } catch {\n    throw new Error(\n      'Farm api.baseURL must be an absolute URL or a root-relative path such as \"/api\".',\n    );\n  }\n\n  if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n    throw new Error(\"Farm api.baseURL must use http or https.\");\n  }\n  if (url.search || url.hash) {\n    throw new Error(\"Farm api.baseURL cannot contain a query string or hash.\");\n  }\n\n  if (url.pathname !== \"/\") {\n    const effectivePath = normalizeFarmAPIBasePath(url.pathname);\n    return {\n      baseURL: `${url.origin}${effectivePath}`,\n      basePath: effectivePath,\n    };\n  }\n\n  return {\n    baseURL: basePath === \"/\" ? url.origin : `${url.origin}${basePath}`,\n    basePath,\n  };\n}\n\nexport function normalizeFarmAPIBasePath(value: string): string {\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(value)) {\n    throw new Error(\"Farm api.basePath cannot contain backslashes or control characters.\");\n  }\n\n  const path = value.trim();\n  if (!path) {\n    throw new Error(\"Farm api.basePath cannot be empty.\");\n  }\n  if (path.includes(\"?\") || path.includes(\"#\")) {\n    throw new Error(\"Farm api.basePath cannot contain a query string or hash.\");\n  }\n  if (path.startsWith(\"//\")) {\n    throw new Error('Farm api.basePath must be a pathname such as \"/api\", not a URL.');\n  }\n  for (const segment of path.split(\"/\")) {\n    let decoded = segment;\n    try {\n      decoded = decodeURIComponent(segment);\n    } catch {\n      // A malformed escape remains literal in a URL pathname. It cannot be a\n      // dot segment, so leave the ordinary URL parser to preserve it.\n    }\n    if (hasUnstableCharacters(decoded)) {\n      throw new Error(\"Farm api.basePath cannot contain backslashes or control characters.\");\n    }\n    if (decoded.includes(\"/\")) {\n      throw new Error(\"Farm api.basePath cannot contain percent-encoded path separators.\");\n    }\n    if (decoded === \".\" || decoded === \"..\") {\n      throw new Error('Farm api.basePath cannot contain \".\" or \"..\" path segments.');\n    }\n  }\n\n  const normalized = `/${path.replace(/^\\/+|\\/+$/g, \"\")}`;\n  return normalized === \"/\" ? \"/\" : normalized;\n}\n\n/** Read the API root embedded by Farm's Vite build. */\nexport function getFarmAPIBaseURL(): string {\n  if (typeof __FARM_API_BASE_URL__ !== \"undefined\" && __FARM_API_BASE_URL__) {\n    return __FARM_API_BASE_URL__;\n  }\n  return DEFAULT_FARM_API_BASE_PATH;\n}\n\n/** Resolve a canonical Farm route such as `/api/users` against an API root. */\nexport function resolveFarmAPIRequestURL(\n  routePath: string,\n  baseURL = getFarmAPIBaseURL(),\n  fallbackOrigin = getDefaultOrigin(),\n): URL {\n  const base = new URL(baseURL, fallbackOrigin);\n  if (base.pathname === \"/\") {\n    return new URL(routePath, base);\n  }\n\n  const route = new URL(routePath, fallbackOrigin);\n  const suffix = stripCanonicalAPIBasePath(route.pathname);\n  const joinedPath = joinURLPath(base.pathname, suffix);\n  base.pathname = joinedPath;\n  base.search = route.search;\n  base.hash = route.hash;\n  return base;\n}\n\nasync function resolveConfigValue(\n  value: FarmAPIConfigValue,\n  context: FarmAPIConfigResolverContext,\n  name: string,\n): Promise<string | undefined> {\n  const resolved = typeof value === \"function\" ? await value(context) : value;\n  if (resolved === undefined) return undefined;\n  if (typeof resolved !== \"string\") {\n    throw new Error(`Farm ${name} must resolve to a string or undefined.`);\n  }\n  if (!resolved.trim()) {\n    throw new Error(`Farm ${name} cannot be empty.`);\n  }\n  return resolved;\n}\n\nfunction parseRootRelativeBaseURL(value: string): URL {\n  const url = new URL(value, \"http://farm.local\");\n  if (url.search || url.hash) {\n    throw new Error(\"Farm api.baseURL cannot contain a query string or hash.\");\n  }\n  return url;\n}\n\nfunction stripCanonicalAPIBasePath(pathname: string): string {\n  if (pathname === DEFAULT_FARM_API_BASE_PATH) return \"\";\n  if (pathname.startsWith(`${DEFAULT_FARM_API_BASE_PATH}/`)) {\n    return pathname.slice(DEFAULT_FARM_API_BASE_PATH.length + 1);\n  }\n  return pathname.replace(/^\\/+/, \"\");\n}\n\nfunction joinURLPath(basePath: string, suffix: string): string {\n  const normalizedBase = basePath === \"/\" ? \"\" : basePath.replace(/\\/+$/, \"\");\n  const normalizedSuffix = suffix.replace(/^\\/+/, \"\");\n  if (!normalizedSuffix) return normalizedBase || \"/\";\n  return `${normalizedBase}/${normalizedSuffix}`;\n}\n\nfunction getDefaultOrigin(): string {\n  return typeof window !== \"undefined\" ? window.location.origin : \"http://localhost:3000\";\n}\n","import {\n  DEFAULT_FARM_API_BASE_PATH,\n  normalizeFarmAPIBasePath,\n  resolveFarmAPIRequestURL,\n  type ResolvedFarmAPIConfig,\n} from \"./config\";\n\n/** Return the same-origin path served by this Farm application. */\nexport function resolveFarmAPIServerBasePath(config: ResolvedFarmAPIConfig): string {\n  // Absolute API URLs belong to another origin and must not move local routes.\n  return config.baseURL.startsWith(\"/\") ? config.basePath : DEFAULT_FARM_API_BASE_PATH;\n}\n\n/** Translate a public local API pathname back to Farm's canonical `/api` route table. */\nexport function resolveFarmAPICanonicalPathname(\n  pathname: string,\n  serverBasePath = DEFAULT_FARM_API_BASE_PATH,\n): string {\n  const basePath = normalizeFarmAPIBasePath(serverBasePath);\n  if (basePath === DEFAULT_FARM_API_BASE_PATH) return pathname;\n\n  if (basePath === \"/\") {\n    return pathname === \"/\"\n      ? DEFAULT_FARM_API_BASE_PATH\n      : `${DEFAULT_FARM_API_BASE_PATH}${pathname.startsWith(\"/\") ? pathname : `/${pathname}`}`;\n  }\n\n  if (pathname === basePath) return DEFAULT_FARM_API_BASE_PATH;\n  if (pathname.startsWith(`${basePath}/`)) {\n    return `${DEFAULT_FARM_API_BASE_PATH}${pathname.slice(basePath.length)}`;\n  }\n  return pathname;\n}\n\n/** Resolve a canonical `/api` route to the path served by this application. */\nexport function resolveFarmAPIServerRoutePath(\n  routePath: string,\n  serverBasePath = DEFAULT_FARM_API_BASE_PATH,\n): string {\n  return resolveFarmAPIRequestURL(routePath, serverBasePath).pathname;\n}\n","/** Server-only schema contract shared by declarative routes and the API runtime. */\nexport interface RouteSchema {\n  readonly _input?: unknown;\n  readonly _output?: unknown;\n  parse?: (value: unknown) => unknown;\n  parseAsync?: (value: unknown) => Promise<unknown>;\n  readonly \"~standard\"?: {\n    readonly types?: { input: unknown; output: unknown };\n    validate(value: unknown): unknown;\n  };\n}\n\nexport type RouteSchemaInput<T> = T extends { _input: infer I }\n  ? I\n  : T extends { \"~standard\": { types?: { input: infer I } } }\n    ? I\n    : unknown;\n\nexport type RouteSchemaOutput<T> = T extends { _output: infer O }\n  ? O\n  : T extends { \"~standard\": { types?: { output: infer O } } }\n    ? O\n    : T extends { parse: (...args: any[]) => infer O }\n      ? Awaited<O>\n      : unknown;\n\nexport async function parseRouteSchema(schema: RouteSchema, value: unknown): Promise<unknown> {\n  if (schema[\"~standard\"]) {\n    const result = (await schema[\"~standard\"].validate(value)) as {\n      value?: unknown;\n      issues?: readonly unknown[];\n    };\n    if (result.issues)\n      throw Object.assign(new Error(\"Validation failed\"), { issues: result.issues });\n    return result.value;\n  }\n  if (schema.parseAsync) return schema.parseAsync(value);\n  if (schema.parse) return schema.parse(value);\n  throw new TypeError(\"Route validators must implement Standard Schema or parse().\");\n}\n","/** @internal */\nexport function omitFarmResponseBody(response: Response): Response {\n  if (response.body) {\n    void response.body.cancel().catch(() => undefined);\n  }\n\n  return new Response(null, {\n    status: response.status,\n    statusText: response.statusText,\n    headers: response.headers,\n  });\n}\n","import {\n  AmbiguousRouteError,\n  assertUniqueRouteParameters,\n  getRoutePatternShape,\n} from \"../routing/specificity\";\n\nexport interface APIRouteShapeSource<TSource> {\n  routePath: string;\n  source: TSource;\n  filePath: string;\n}\n\n/** Validate API URL shapes and return the lower-priority route replaced by this source. */\nexport function registerAPIRouteShape<TSource>(\n  shapes: Map<string, APIRouteShapeSource<TSource>>,\n  routePath: string,\n  filePath: string,\n  source: TSource,\n): string | undefined {\n  assertUniqueRouteParameters(routePath, \"api\");\n  const shape = getRoutePatternShape(routePath, \"api\");\n  const existing = shapes.get(shape);\n  const replacesPath = existing && existing.routePath !== routePath;\n\n  if (replacesPath && existing.source === source) {\n    throw new AmbiguousRouteError(\n      `Ambiguous API routes \"${existing.routePath}\" and \"${routePath}\" match the same URLs. Found ${existing.filePath} and ${filePath}. Keep only one route for this URL shape.`,\n    );\n  }\n\n  shapes.set(shape, { routePath, source, filePath });\n  return replacesPath ? existing.routePath : undefined;\n}\n","import {\n  createEndpoint,\n  type TypedEndpoint,\n  type AnyEndpointMiddleware,\n  type EndpointMiddlewareResult,\n  type InferEndpointMiddlewareContext,\n} from \"./endpoint\";\nimport {\n  assertBrowserStableRoutePath,\n  assertUniqueRouteParameters,\n  getRoutePatternShape,\n} from \"../routing/specificity\";\nimport type { RouteSchema, RouteSchemaInput, RouteSchemaOutput } from \"./route-schema\";\n\nexport type RouteMethod =\n  | \"GET\"\n  | \"HEAD\"\n  | \"QUERY\"\n  | \"POST\"\n  | \"PUT\"\n  | \"PATCH\"\n  | \"DELETE\"\n  | \"OPTIONS\";\nexport type RoutePathParams<Path extends string> = Path extends `${infer Head}/${infer Tail}`\n  ? RoutePathParams<Head> & RoutePathParams<Tail>\n  : Path extends `[[...${infer Name}]]`\n    ? { [K in Name]?: string[] }\n    : Path extends `[...${infer Name}]`\n      ? { [K in Name]: string[] }\n      : Path extends `[${infer Name}]`\n        ? { [K in Name]: string }\n        : {};\n\nexport interface RouteInputSchemas {\n  body?: RouteSchema;\n  query?: RouteSchema;\n  params?: RouteSchema;\n  headers?: RouteSchema;\n}\ntype Input<I, K extends PropertyKey> = K extends keyof I ? RouteSchemaInput<I[K]> : never;\ntype Output<I, K extends PropertyKey, Fallback = unknown> = K extends keyof I\n  ? RouteSchemaOutput<I[K]>\n  : Fallback;\n/** JSON responses have wire types, not server-side instances such as Date. */\nexport type RouteJSON<T> = T extends Response\n  ? unknown\n  : T extends { toJSON(): infer J }\n    ? RouteJSON<J>\n    : T extends bigint | symbol | ((...args: any[]) => any)\n      ? never\n      : T extends readonly (infer V)[]\n        ? RouteJSON<V>[]\n        : T extends object\n          ? { [K in keyof T]: RouteJSON<T[K]> }\n          : T;\n\nexport type RouteDefinition<\n  P extends string = string,\n  M extends RouteMethod = RouteMethod,\n  E = any,\n> = {\n  readonly path: P;\n  readonly method: M;\n  readonly endpoint: E;\n};\n\ntype RouteEndpoint<P extends string, I extends RouteInputSchemas, R> = TypedEndpoint<\n  Output<I, \"body\">,\n  Input<I, \"query\">,\n  RouteJSON<R>,\n  Input<I, \"headers\">,\n  never,\n  Input<I, \"body\">\n> & {\n  __types: { params: RoutePathParams<P>; inputHeaders: Input<I, \"headers\"> };\n};\n\ntype TrimStart<P extends string> = P extends `/${infer Rest}` ? TrimStart<Rest> : P;\ntype Join<P extends string, C extends string> = C extends \"\" ? P : `${P}/${TrimStart<C>}`;\ntype ParamsCheck<P extends string, I extends RouteInputSchemas> = I extends { params: infer S }\n  ? Exclude<keyof RoutePathParams<P>, keyof RouteSchemaOutput<S>> extends never\n    ? Exclude<keyof RouteSchemaOutput<S>, keyof RoutePathParams<P>> extends never\n      ? unknown\n      : { __error_unknown_route_params: never }\n    : { __error_missing_route_params: never }\n  : unknown;\n\ntype RouteMiddlewareResults = readonly (\n  | EndpointMiddlewareResult\n  | Promise<EndpointMiddlewareResult>\n)[];\n// Infer callback results directly so inline middleware is contextually typed before\n// its returned context is exposed to the route handler.\ntype RouteMiddlewares<Results extends readonly unknown[]> = {\n  readonly [K in keyof Results]: (context: Parameters<AnyEndpointMiddleware>[0]) => Results[K];\n};\n\nexport type RouteOptions<\n  P extends string,\n  I extends RouteInputSchemas,\n  O extends RouteSchema | undefined,\n  R,\n  MiddlewareResults extends RouteMiddlewareResults = RouteMiddlewareResults,\n> = {\n  input?: I & ParamsCheck<P, I>;\n  /** Validate plain JSON handler results. Raw Response/stream results are never buffered. */\n  output?: O;\n  middleware?: RouteMiddlewares<MiddlewareResults>;\n  handler(\n    request: Request,\n    context: {\n      input: {\n        body: Output<I, \"body\">;\n        query: Output<I, \"query\", Record<string, string | string[]>>;\n        headers: Output<I, \"headers\", Record<string, string>>;\n        params: Output<I, \"params\", RoutePathParams<P>>;\n      };\n      params: Output<I, \"params\", RoutePathParams<P>>;\n      context: Readonly<InferEndpointMiddlewareContext<RouteMiddlewares<MiddlewareResults>>>;\n    },\n  ): R | Promise<R>;\n};\n\ntype RouteBuilder<P extends string, M extends RouteMethod> = <\n  const C extends string,\n  const MiddlewareResults extends RouteMiddlewareResults,\n  const I extends RouteInputSchemas = {},\n  O extends RouteSchema | undefined = undefined,\n  R = unknown,\n>(\n  path: C,\n  options: RouteOptions<Join<P, C>, I, O, R, MiddlewareResults>,\n) => RouteDefinition<\n  Join<P, C>,\n  M,\n  RouteEndpoint<\n    Join<P, C>,\n    I,\n    Extract<Awaited<R>, Response> extends never\n      ? O extends RouteSchema\n        ? RouteSchemaOutput<O>\n        : Awaited<R>\n      : unknown\n  >\n>;\n\nexport type RouteFactory<P extends string = \"\"> = {\n  [M in Lowercase<RouteMethod>]: RouteBuilder<P, Uppercase<M> & RouteMethod>;\n} & {\n  /** Return a new builder; never mutate the parent scope. */\n  scope<const C extends string>(path: C): RouteFactory<Join<P, C>>;\n};\n\nexport type PluginRoutes = readonly RouteDefinition[];\nexport type PluginRoutesFactory<R extends PluginRoutes = PluginRoutes> = (context: {\n  route: RouteFactory;\n}) => R;\n\nexport function createRouteFactory(): RouteFactory {\n  return createRouteFactoryAt(\"\");\n}\n\nfunction createRouteFactoryAt(prefix: string): RouteFactory {\n  const factory: Record<string, unknown> = {\n    scope(child: string) {\n      return createRouteFactoryAt(joinRoutePath(prefix, child));\n    },\n  };\n  for (const method of [\n    \"GET\",\n    \"HEAD\",\n    \"QUERY\",\n    \"POST\",\n    \"PUT\",\n    \"PATCH\",\n    \"DELETE\",\n    \"OPTIONS\",\n  ] as const) {\n    factory[method.toLowerCase()] = (\n      child: string,\n      options: RouteOptions<string, any, any, any>,\n    ) => {\n      const path = joinRoutePath(prefix, child);\n      const input = options.input ?? {};\n      const endpoint = createEndpoint(\n        path,\n        {\n          method,\n          body: input.body,\n          query: input.query,\n          headers: input.headers,\n          middleware: options.middleware,\n        },\n        (ctx) =>\n          options.handler(ctx.request, {\n            input: { body: ctx.body, query: ctx.query, headers: ctx.headers, params: ctx.params },\n            params: ctx.params,\n            context: ctx.context,\n          }),\n      ) as any;\n      endpoint.__types.params = input.params;\n      endpoint.__output = options.output;\n      return Object.freeze({ path, method, endpoint });\n    };\n  }\n  return Object.freeze(factory) as RouteFactory;\n}\n\nfunction joinRoutePath(prefix: string, child: string): string {\n  if (typeof child !== \"string\") throw new TypeError(\"Route paths must be strings.\");\n  const path = child === \"\" ? prefix : `${prefix}/${child.replace(/^\\//, \"\")}`;\n  if (!(path === \"/api\" || path.startsWith(\"/api/\")) || /[?#]|\\/\\/|\\/$/.test(path)) {\n    throw new TypeError(\n      `Plugin route \"${path}\" must be a canonical /api path without a query, hash, or empty segment.`,\n    );\n  }\n  assertBrowserStableRoutePath(path);\n  assertUniqueRouteParameters(path, \"api\");\n  getRoutePatternShape(path, \"api\");\n  for (const segment of path.split(\"/\")) {\n    if ([\"__proto__\", \"constructor\", \"prototype\", \"$params\"].includes(segment)) {\n      throw new TypeError(`Route segment \"${segment}\" is reserved.`);\n    }\n  }\n  return path;\n}\n\ntype UnionToIntersection<U> = (U extends unknown ? (v: U) => void : never) extends (\n  v: infer I,\n) => void\n  ? I\n  : never;\ntype RouteTree<P extends string, M extends string, E> = P extends `${infer Head}/${infer Tail}`\n  ? { [K in Head]: RouteTree<Tail, M, E> }\n  : P extends \"\"\n    ? { [K in Lowercase<M>]: E }\n    : { [K in P]: { [Method in Lowercase<M>]: E } };\ntype HasMethodSegment<P extends string> = P extends `${infer H}/${infer T}`\n  ? H extends Lowercase<RouteMethod>\n    ? true\n    : HasMethodSegment<T>\n  : P extends Lowercase<RouteMethod>\n    ? true\n    : false;\ntype DefinitionTree<D> =\n  D extends RouteDefinition<infer P, infer M, infer E>\n    ? string extends P\n      ? {}\n      : (P extends `/api/integrations${string}` ? true : HasMethodSegment<P>) extends true\n        ? { [K in P extends `/api/${infer C}` ? `/${C}` : \"/\"]: { [Method in Lowercase<M>]: E } }\n        : RouteTree<P extends `/api/${infer C}` ? C : \"\", M, E>\n    : {};\nexport type PluginAPIRouter<C> = C extends { plugins: readonly (infer P)[] }\n  ? UnionToIntersection<\n      P extends { routes?: PluginRoutesFactory<infer R> } ? DefinitionTree<R[number]> : {}\n    >\n  : {};\n\nexport function resolvePluginRoutes(\n  plugins: readonly { name: string; routes?: PluginRoutesFactory }[] = [],\n): PluginRoutes {\n  return plugins.flatMap((plugin) => {\n    if (!plugin.routes) return [];\n    const routes = plugin.routes({ route: createRouteFactory() });\n    if (!Array.isArray(routes))\n      throw new TypeError(`Plugin \"${plugin.name}\" routes must return an array synchronously.`);\n    for (const route of routes) {\n      if (\n        !route ||\n        joinRoutePath(\"\", route.path) !== route.path ||\n        typeof route.endpoint !== \"function\" ||\n        ![\"GET\", \"HEAD\", \"QUERY\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"].includes(\n          route.method,\n        )\n      ) {\n        throw new TypeError(`Plugin \"${plugin.name}\" returned an invalid API route.`);\n      }\n    }\n    return routes;\n  });\n}\n","import { resolvePluginRoutes, type PluginRoutesFactory } from \"./route\";\nimport { registerAPIRouteShape } from \"./route-shape\";\n\ninterface MountedRoute {\n  path: string;\n  methods: string[];\n  endpoints: Record<string, any>;\n  filePath?: string;\n  pluginMethods?: string[];\n}\n\n/** The same registration step is used by dev discovery and the production bundle. */\nexport function mergePluginAPIRoutes(\n  existing: readonly MountedRoute[],\n  plugins: readonly { name: string; routes?: PluginRoutesFactory }[],\n  expected?: readonly { path: string; methods: readonly string[] }[],\n): Array<MountedRoute & { filePath: string }> {\n  const routes = new Map<string, MountedRoute & { filePath: string }>();\n  const shapes = new Map();\n  for (const route of existing) {\n    registerAPIRouteShape(shapes, route.path, route.filePath || route.path, \"app\");\n    routes.set(route.path, {\n      ...route,\n      filePath: route.filePath || \"\",\n      methods: [...route.methods],\n      endpoints: { ...route.endpoints },\n    });\n  }\n  for (const definition of resolvePluginRoutes(plugins)) {\n    registerAPIRouteShape(shapes, definition.path, `plugin:${definition.path}`, \"app\");\n    let route = routes.get(definition.path);\n    if (route?.methods.includes(definition.method)) {\n      throw new Error(\n        `Duplicate API route for ${definition.method} ${definition.path}. Plugin routes cannot override app or other plugin endpoints.`,\n      );\n    }\n    if (!route) {\n      route = { path: definition.path, filePath: \"\", methods: [], endpoints: {} };\n      routes.set(definition.path, route);\n    }\n    route.methods.push(definition.method);\n    route.pluginMethods = [...(route.pluginMethods ?? []), definition.method];\n    route.endpoints[definition.method] = definition.endpoint;\n  }\n  const result = [...routes.values()];\n  if (expected) {\n    const signature = (entries: readonly { path: string; methods: readonly string[] }[]) =>\n      entries\n        .map(({ path, methods }) => `${path}:${[...methods].sort().join(\",\")}`)\n        .sort()\n        .join(\"\\n\");\n    if (signature(result) !== signature(expected)) {\n      throw new Error(\n        \"Plugin API routes changed between build and runtime. Route paths and methods must be stable across environments; rebuild the app.\",\n      );\n    }\n  }\n  return result;\n}\n","import { compareRouteSpecificity, type RouteSegmentSpecificity } from \"../routing/specificity\";\n\nexport type APIRouteParamValue = string | string[];\nexport type APIRouteParams = Record<string, APIRouteParamValue>;\n\nexport interface APIRouteMatch<T extends { path: string }> {\n  route: T;\n  params: APIRouteParams;\n}\n\nexport function matchAPIRoute<T extends { path: string }>(\n  routes: Map<string, T>,\n  pathname: string,\n): APIRouteMatch<T> | null {\n  const exactRoute = routes.get(pathname);\n  if (exactRoute) {\n    return { route: exactRoute, params: {} };\n  }\n\n  const normalizedPathname = normalizePathname(pathname);\n  if (normalizedPathname !== pathname) {\n    const normalizedRoute = routes.get(normalizedPathname);\n    if (normalizedRoute) {\n      return { route: normalizedRoute, params: {} };\n    }\n  }\n\n  let bestMatch: APIRouteMatch<T> | null = null;\n  let bestSpecificity: RouteSegmentSpecificity[] | null = null;\n\n  for (const route of routes.values()) {\n    const params = matchRoutePath(route.path, pathname);\n    if (!params) continue;\n\n    const specificity = getAPIRouteSpecificity(route.path);\n    if (bestSpecificity === null || compareRouteSpecificity(specificity, bestSpecificity) < 0) {\n      bestMatch = { route, params };\n      bestSpecificity = specificity;\n    }\n  }\n\n  return bestMatch;\n}\n\nfunction matchRoutePath(routePath: string, pathname: string): APIRouteParams | null {\n  const routeSegments = getPathSegments(routePath);\n  const pathnameSegments = getPathSegments(pathname);\n  const params: APIRouteParams = {};\n  let pathIndex = 0;\n\n  for (const routeSegment of routeSegments) {\n    const dynamicSegment = parseDynamicSegment(routeSegment);\n\n    if (dynamicSegment?.catchAll) {\n      const remainingSegments = pathnameSegments.slice(pathIndex).map(decodePathSegment);\n      if (remainingSegments.length === 0 && !dynamicSegment.optional) {\n        return null;\n      }\n      if (remainingSegments.length > 0) {\n        params[dynamicSegment.name] = remainingSegments;\n      }\n      pathIndex = pathnameSegments.length;\n      continue;\n    }\n\n    const pathnameSegment = pathnameSegments[pathIndex];\n    if (pathnameSegment === undefined) {\n      return null;\n    }\n\n    if (dynamicSegment) {\n      params[dynamicSegment.name] = decodePathSegment(pathnameSegment);\n      pathIndex++;\n      continue;\n    }\n\n    if (decodePathSegment(routeSegment) !== decodePathSegment(pathnameSegment)) {\n      return null;\n    }\n\n    pathIndex++;\n  }\n\n  return pathIndex === pathnameSegments.length ? params : null;\n}\n\nfunction getPathSegments(pathname: string): string[] {\n  return normalizePathname(pathname)\n    .split(\"/\")\n    .filter((segment) => segment.length > 0);\n}\n\nfunction getAPIRouteSpecificity(routePath: string): RouteSegmentSpecificity[] {\n  return getPathSegments(routePath).map((segment) => {\n    const dynamic = parseDynamicSegment(segment);\n    if (!dynamic) return \"static\";\n    if (!dynamic.catchAll) return \"dynamic\";\n    return dynamic.optional ? \"optional-catch-all\" : \"catch-all\";\n  });\n}\n\nfunction normalizePathname(pathname: string): string {\n  if (pathname.length > 1 && pathname.endsWith(\"/\")) {\n    return pathname.replace(/\\/+$/, \"\");\n  }\n\n  return pathname;\n}\n\nexport function parseDynamicSegment(\n  segment: string,\n): { name: string; catchAll: boolean; optional: boolean } | null {\n  const optionalCatchAll = segment.match(/^\\[\\[\\.\\.\\.(.+)\\]\\]$/);\n  if (optionalCatchAll?.[1]) {\n    return { name: optionalCatchAll[1], catchAll: true, optional: true };\n  }\n\n  const catchAll = segment.match(/^\\[\\.\\.\\.(.+)\\]$/);\n  if (catchAll?.[1]) {\n    return { name: catchAll[1], catchAll: true, optional: false };\n  }\n\n  const dynamic = segment.match(/^\\[(.+)\\]$/);\n  if (dynamic?.[1]) {\n    return { name: dynamic[1], catchAll: false, optional: false };\n  }\n\n  return null;\n}\n\nfunction decodePathSegment(segment: string): string {\n  try {\n    return decodeURIComponent(segment);\n  } catch {\n    return segment;\n  }\n}\n"],"mappings":"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","names":["serialized","betterCallEndpoint","context","result","response"]}