@farm.js/core 0.1.0-beta.75 → 0.1.0-beta.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/agent-runtime.cjs +7 -0
  2. package/dist/agent-runtime.cjs.map +1 -1
  3. package/dist/agent-runtime.mjs +7 -0
  4. package/dist/agent-runtime.mjs.map +1 -1
  5. package/dist/{app-BkCh7H09.d.mts → app-Bq-Tr90H.d.mts} +2 -0
  6. package/dist/{app-CZIEOZIa.d.ts → app-CQ6uhLEj.d.ts} +2 -0
  7. package/dist/{chunk-S6FO7OXA.mjs → chunk-BF47GPQF.mjs} +59 -8
  8. package/dist/chunk-BF47GPQF.mjs.map +1 -0
  9. package/dist/{chunk-DKD7DGTE.mjs → chunk-KDKXMAIQ.mjs} +2 -2
  10. package/dist/{chunk-UGK7TW2V.mjs → chunk-P57PPOQL.mjs} +18 -6
  11. package/dist/chunk-P57PPOQL.mjs.map +1 -0
  12. package/dist/{chunk-IIKQBOGZ.mjs → chunk-PZLBMD63.mjs} +2 -2
  13. package/dist/{chunk-IIKQBOGZ.mjs.map → chunk-PZLBMD63.mjs.map} +1 -1
  14. package/dist/{chunk-TWN6IBIL.mjs → chunk-UBDJMY7B.mjs} +2 -2
  15. package/dist/client/lifecycle.mjs +2 -2
  16. package/dist/client-plugins.cjs +1 -1
  17. package/dist/client-plugins.cjs.map +1 -1
  18. package/dist/client-plugins.mjs +2 -2
  19. package/dist/client.cjs +1 -1
  20. package/dist/client.cjs.map +1 -1
  21. package/dist/client.mjs +2 -2
  22. package/dist/index.cjs +82 -12
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.mts +1 -1
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.mjs +5 -5
  27. package/dist/internal/build-runtime.cjs +65 -7
  28. package/dist/internal/build-runtime.cjs.map +1 -1
  29. package/dist/internal/build-runtime.mjs +3 -3
  30. package/dist/internal/client-runtime.cjs +1 -1
  31. package/dist/internal/client-runtime.cjs.map +1 -1
  32. package/dist/internal/client-runtime.mjs +2 -2
  33. package/dist/internal/product-telemetry-runtime.cjs +1 -1
  34. package/dist/internal/product-telemetry-runtime.cjs.map +1 -1
  35. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  36. package/dist/plugin.cjs +58 -7
  37. package/dist/plugin.cjs.map +1 -1
  38. package/dist/plugin.mjs +2 -2
  39. package/dist/server-plugins.cjs +17 -5
  40. package/dist/server-plugins.cjs.map +1 -1
  41. package/dist/server-plugins.mjs +1 -1
  42. package/dist/server.cjs +75 -12
  43. package/dist/server.cjs.map +1 -1
  44. package/dist/server.d.mts +1 -1
  45. package/dist/server.d.ts +1 -1
  46. package/dist/server.mjs +3 -3
  47. package/dist/version.cjs +1 -1
  48. package/dist/version.cjs.map +1 -1
  49. package/dist/version.mjs +1 -1
  50. package/dist/vite.cjs +58 -7
  51. package/dist/vite.cjs.map +1 -1
  52. package/dist/vite.mjs +2 -2
  53. package/package.json +1 -1
  54. package/dist/chunk-S6FO7OXA.mjs.map +0 -1
  55. package/dist/chunk-UGK7TW2V.mjs.map +0 -1
  56. /package/dist/{chunk-DKD7DGTE.mjs.map → chunk-KDKXMAIQ.mjs.map} +0 -0
  57. /package/dist/{chunk-TWN6IBIL.mjs.map → chunk-UBDJMY7B.mjs.map} +0 -0
@@ -399,6 +399,13 @@ function createProxyRequestHeaders(input, incomingUrl) {
399
399
  }
400
400
  __name(createProxyRequestHeaders, "createProxyRequestHeaders");
401
401
  function removeHopByHopHeaders(headers) {
402
+ const connectionOptions = headers.get("connection")?.split(",") ?? [];
403
+ for (const option of connectionOptions) {
404
+ const header = option.trim();
405
+ if (/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(header)) {
406
+ headers.delete(header);
407
+ }
408
+ }
402
409
  for (const header of HOP_BY_HOP_HEADERS) {
403
410
  headers.delete(header);
404
411
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/agent-runtime.ts"],"sourcesContent":["import { spawn, type ChildProcess } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { defineIntegration, type FarmIntegration } from \"./integrations\";\nimport type { BundleResultPayload, FarmPlugin } from \"./plugin\";\n\nconst AGENT_RUNTIME_METHODS = [\n \"GET\",\n \"HEAD\",\n \"QUERY\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n] as const;\n\nconst HOP_BY_HOP_HEADERS = [\n \"connection\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n] as const;\n\nexport interface FarmAgentRuntimeInstance {\n readonly provider: string;\n readonly routePrefix: string;\n readonly routePrefixes: readonly string[];\n getOrigin(): string | undefined;\n}\n\nexport interface FarmManagedAgentRuntime {\n readonly origin: string;\n readonly process?: ChildProcess;\n stop(): Promise<void>;\n}\n\nexport interface FarmAgentRuntimeStartContext {\n readonly root: string;\n readonly log: {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n };\n}\n\nexport interface FarmAgentRuntimeBuildContext extends BundleResultPayload {\n readonly provider: string;\n readonly routePrefix: string;\n readonly routePrefixes: readonly string[];\n}\n\nexport interface FarmAgentRuntimeIntegrationOptions {\n provider: string;\n routePrefix: string;\n /** Whether Farm's production server must dispatch this runtime's proxy routes. */\n serverRuntime?: boolean;\n additionalRoutePrefixes?: readonly string[];\n origin?: string;\n originEnv?: string | readonly string[];\n webSockets?: boolean;\n startDev?(context: FarmAgentRuntimeStartContext): Promise<FarmManagedAgentRuntime>;\n afterBuild?(context: FarmAgentRuntimeBuildContext): Promise<void> | void;\n plugins?: readonly FarmPlugin[];\n instance?: Record<string, unknown>;\n}\n\nexport interface FarmManagedProcessOptions {\n command: string;\n args?: readonly string[];\n cwd: string;\n env?: Record<string, string | undefined>;\n label: string;\n origin?: string;\n resolveOrigin?(output: string): string | undefined;\n healthPath?: string;\n timeoutMs?: number;\n stopTimeoutMs?: number;\n onOutput?(line: string, stream: \"stdout\" | \"stderr\"): void;\n}\n\nexport interface FarmAgentProxyOptions {\n fetch?: typeof globalThis.fetch;\n}\n\ninterface RuntimeState {\n origin?: string;\n managed?: FarmManagedAgentRuntime;\n}\n\nexport function createAgentRuntimeIntegration(\n options: FarmAgentRuntimeIntegrationOptions,\n): FarmIntegration {\n const provider = normalizeProviderName(options.provider);\n const routePrefix = normalizeAgentRoutePrefix(options.routePrefix);\n const routePrefixes = [\n routePrefix,\n ...(options.additionalRoutePrefixes || []).map(normalizeAgentRoutePrefix),\n ].filter((prefix, index, values) => values.indexOf(prefix) === index);\n const originEnv = normalizeOriginEnv(options.originEnv);\n const state: RuntimeState = {\n origin: resolveConfiguredOrigin(options.origin, originEnv),\n };\n\n const runtimeInstance: FarmAgentRuntimeInstance & Record<string, unknown> = {\n ...options.instance,\n provider,\n routePrefix,\n routePrefixes,\n getOrigin: () => state.origin ?? resolveConfiguredOrigin(options.origin, originEnv),\n };\n\n const runtimePlugin: FarmPlugin = {\n name: `farm:agent-runtime:${provider}`,\n config(config, context) {\n if (!context.isDev) {\n return config;\n }\n\n const origin = runtimeInstance.getOrigin();\n if (!origin) {\n return config;\n }\n\n for (const prefix of routePrefixes) {\n applyAgentRuntimeViteProxy(config, {\n origin,\n routePrefix: prefix,\n webSockets: options.webSockets,\n });\n }\n return config;\n },\n async afterBundle(result) {\n if (!result.success || !options.afterBuild) {\n return;\n }\n\n await options.afterBuild({\n ...result,\n provider,\n routePrefix,\n routePrefixes,\n });\n },\n };\n\n return defineIntegration({\n category: \"agent\",\n type: provider,\n serverRuntime: options.serverRuntime,\n instance: runtimeInstance,\n async setup(context) {\n if (!context.isDev || state.origin || !options.startDev) {\n return;\n }\n\n state.managed = await options.startDev({\n root: context.appConfig.root || process.cwd(),\n log: context.log,\n });\n state.origin = normalizeAgentOrigin(state.managed.origin);\n context.log.info(`${provider} runtime ready`, {\n origin: state.origin,\n });\n await context.cleanup(async () => {\n await state.managed?.stop();\n state.managed = undefined;\n state.origin = undefined;\n });\n },\n routes: routePrefixes.map((prefix) => ({\n path: `${prefix}/[...farmAgentRuntimePath]`,\n methods: AGENT_RUNTIME_METHODS,\n rawBody: true,\n async handler(request) {\n const origin = runtimeInstance.getOrigin();\n if (!origin) {\n return Response.json(\n {\n error: \"Agent runtime unavailable\",\n provider,\n },\n { status: 503 },\n );\n }\n\n return proxyAgentRuntimeRequest(request, origin);\n },\n })),\n plugins: [runtimePlugin, ...(options.plugins || [])],\n });\n}\n\nexport function applyAgentRuntimeViteProxy(\n config: { vite?: Record<string, any> },\n input: {\n origin: string;\n routePrefix: string;\n webSockets?: boolean;\n },\n): void {\n const origin = normalizeAgentOrigin(input.origin);\n const routePrefix = normalizeAgentRoutePrefix(input.routePrefix);\n const vite = config.vite || {};\n const server = vite.server || {};\n const proxy = server.proxy || {};\n\n if (proxy[routePrefix]) {\n throw new Error(\n `Farm agent runtime cannot own ${routePrefix} because vite.server.proxy already defines it.`,\n );\n }\n\n config.vite = {\n ...vite,\n server: {\n ...server,\n proxy: {\n ...proxy,\n [routePrefix]: {\n target: origin,\n changeOrigin: true,\n ws: input.webSockets === true,\n },\n },\n },\n };\n}\n\nexport async function proxyAgentRuntimeRequest(\n request: Request,\n origin: string,\n options: FarmAgentProxyOptions = {},\n): Promise<Response> {\n const upstreamOrigin = normalizeAgentOrigin(origin);\n const incomingUrl = new URL(request.url);\n const targetUrl = new URL(`${incomingUrl.pathname}${incomingUrl.search}`, upstreamOrigin);\n const headers = createProxyRequestHeaders(request.headers, incomingUrl);\n const method = request.method.toUpperCase();\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n redirect: \"manual\",\n signal: request.signal,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && request.body) {\n init.body = request.body;\n init.duplex = \"half\";\n }\n\n try {\n const upstream = await (options.fetch || globalThis.fetch)(targetUrl, init);\n const responseHeaders = new Headers(upstream.headers);\n removeHopByHopHeaders(responseHeaders);\n rewriteProxyLocation(responseHeaders, upstreamOrigin, incomingUrl.origin);\n\n return new Response(upstream.body, {\n status: upstream.status,\n statusText: upstream.statusText,\n headers: responseHeaders,\n });\n } catch (error) {\n if (request.signal.aborted || isAbortError(error)) {\n throw error;\n }\n\n return Response.json(\n {\n error: \"Agent runtime request failed\",\n },\n { status: 502 },\n );\n }\n}\n\nexport async function startManagedAgentRuntime(\n options: FarmManagedProcessOptions,\n): Promise<FarmManagedAgentRuntime> {\n const timeoutMs = options.timeoutMs ?? 30_000;\n const stopTimeoutMs = options.stopTimeoutMs ?? 2_000;\n const fixedOrigin = options.origin ? normalizeAgentOrigin(options.origin) : undefined;\n let output = \"\";\n let settled = false;\n let checkingReadiness = false;\n\n const child = spawn(options.command, [...(options.args || [])], {\n cwd: options.cwd,\n env: {\n ...process.env,\n ...options.env,\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const origin = await new Promise<string>((resolveOrigin, reject) => {\n let timer: ReturnType<typeof setTimeout>;\n\n const finish = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n child.off(\"error\", onError);\n child.off(\"exit\", onExit);\n };\n\n const succeed = async (candidate: string) => {\n if (settled || checkingReadiness) return;\n checkingReadiness = true;\n try {\n const normalized = normalizeAgentOrigin(candidate);\n await waitForAgentRuntime(normalized, options.healthPath, timeoutMs, child);\n finish();\n resolveOrigin(normalized);\n } catch (error) {\n finish();\n terminateChild(child);\n reject(error);\n }\n };\n\n timer = setTimeout(() => {\n finish();\n terminateChild(child);\n reject(new Error(`${options.label} did not become ready within ${timeoutMs}ms.`));\n }, timeoutMs);\n\n const onError = (error: Error) => {\n finish();\n reject(error);\n };\n\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n finish();\n reject(\n new Error(\n `${options.label} exited before it was ready (code ${String(code)}, signal ${String(signal)}).`,\n ),\n );\n };\n\n const onData = (chunk: Buffer, stream: \"stdout\" | \"stderr\") => {\n const text = chunk.toString(\"utf8\");\n output = `${output}${text}`.slice(-16_384);\n emitProcessOutput(text, stream, options.onOutput);\n\n if (!fixedOrigin && options.resolveOrigin) {\n const candidate = options.resolveOrigin(output);\n if (candidate) {\n void succeed(candidate);\n }\n }\n };\n\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n child.stdout?.on(\"data\", (chunk: Buffer) => onData(chunk, \"stdout\"));\n child.stderr?.on(\"data\", (chunk: Buffer) => onData(chunk, \"stderr\"));\n\n if (fixedOrigin) {\n void succeed(fixedOrigin);\n }\n });\n\n return {\n origin,\n process: child,\n async stop() {\n if (child.exitCode !== null || child.signalCode !== null) {\n return;\n }\n\n child.kill(\"SIGTERM\");\n const exited = await waitForChildExit(child, stopTimeoutMs);\n if (!exited && child.exitCode === null && child.signalCode === null) {\n child.kill(\"SIGKILL\");\n await waitForChildExit(child, stopTimeoutMs);\n }\n },\n };\n}\n\nexport async function findAvailableAgentRuntimePort(host = \"127.0.0.1\"): Promise<number> {\n return await new Promise<number>((resolvePort, reject) => {\n const server = createNetServer();\n server.unref();\n server.once(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close();\n reject(new Error(\"Unable to allocate an agent runtime port.\"));\n return;\n }\n\n const port = address.port;\n server.close((error) => {\n if (error) reject(error);\n else resolvePort(port);\n });\n });\n });\n}\n\nexport async function resolveProjectPackageBin(\n projectRoot: string,\n packageName: string,\n binName?: string,\n): Promise<string> {\n const root = resolve(projectRoot);\n const projectRequire = createRequire(join(root, \"package.json\"));\n let packageJsonPath: string;\n\n try {\n packageJsonPath = projectRequire.resolve(`${packageName}/package.json`);\n } catch {\n throw new Error(\n `${packageName} is required by this agent integration. Install it in ${root} and try again.`,\n );\n }\n\n const packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n const bin =\n typeof packageJson.bin === \"string\"\n ? packageJson.bin\n : packageJson.bin?.[binName || packageName.split(\"/\").at(-1) || packageName];\n\n if (!bin) {\n throw new Error(\n `${packageName} does not expose the expected ${binName || packageName} binary.`,\n );\n }\n\n const packageRoot = dirname(packageJsonPath);\n const binaryPath = resolve(packageRoot, bin);\n if (\n relative(packageRoot, binaryPath).startsWith(\"..\") ||\n isAbsolute(relative(packageRoot, binaryPath))\n ) {\n throw new Error(`${packageName} exposes a binary outside its package root.`);\n }\n\n return binaryPath;\n}\n\nexport function normalizeAgentOrigin(value: string): string {\n const input = value.trim();\n if (!input) {\n throw new Error(\"Agent runtime origin cannot be empty.\");\n }\n\n const url = new URL(input);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"Agent runtime origin must use http or https.\");\n }\n if (url.username || url.password) {\n throw new Error(\"Agent runtime origin cannot contain credentials.\");\n }\n if (url.pathname !== \"/\" || url.search || url.hash) {\n throw new Error(\"Agent runtime origin must not contain a path, query, or hash.\");\n }\n\n return url.origin;\n}\n\nexport function normalizeAgentRoutePrefix(value: string): string {\n const normalized = `/${value.trim()}`.replace(/\\/{2,}/g, \"/\");\n if (normalized === \"/\") {\n throw new Error(\"Agent runtime route prefix cannot own the application root.\");\n }\n return normalized.replace(/\\/$/, \"\");\n}\n\nfunction normalizeProviderName(value: string): string {\n const provider = value.trim();\n if (!provider || !/^[a-z0-9][a-z0-9._-]*$/i.test(provider)) {\n throw new Error(\"Agent runtime provider must be a non-empty package-style name.\");\n }\n return provider;\n}\n\nfunction normalizeOriginEnv(value: string | readonly string[] | undefined): readonly string[] {\n if (!value) return [];\n return (Array.isArray(value) ? value : [value]).map((entry) => entry.trim()).filter(Boolean);\n}\n\nfunction resolveConfiguredOrigin(\n configuredOrigin: string | undefined,\n envNames: readonly string[],\n): string | undefined {\n if (configuredOrigin) {\n return normalizeAgentOrigin(configuredOrigin);\n }\n\n for (const envName of envNames) {\n const value = process.env[envName];\n if (value?.trim()) {\n return normalizeAgentOrigin(value);\n }\n }\n\n return undefined;\n}\n\nfunction createProxyRequestHeaders(input: Headers, incomingUrl: URL): Headers {\n const headers = new Headers(input);\n removeHopByHopHeaders(headers);\n headers.delete(\"host\");\n headers.delete(\"content-length\");\n headers.delete(\"accept-encoding\");\n if (!headers.has(\"x-forwarded-host\")) headers.set(\"x-forwarded-host\", incomingUrl.host);\n if (!headers.has(\"x-forwarded-proto\")) {\n headers.set(\"x-forwarded-proto\", incomingUrl.protocol.replace(\":\", \"\"));\n }\n return headers;\n}\n\nfunction removeHopByHopHeaders(headers: Headers): void {\n for (const header of HOP_BY_HOP_HEADERS) {\n headers.delete(header);\n }\n}\n\nfunction rewriteProxyLocation(\n headers: Headers,\n upstreamOrigin: string,\n incomingOrigin: string,\n): void {\n const location = headers.get(\"location\");\n if (!location) return;\n\n try {\n const url = new URL(location, upstreamOrigin);\n if (url.origin === upstreamOrigin) {\n headers.set(\"location\", `${incomingOrigin}${url.pathname}${url.search}${url.hash}`);\n }\n } catch {\n // Preserve non-URL Location values exactly as returned by the runtime.\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nasync function waitForAgentRuntime(\n origin: string,\n healthPath: string | undefined,\n timeoutMs: number,\n child: ChildProcess,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n const healthUrl = new URL(healthPath || \"/\", origin);\n\n while (Date.now() < deadline) {\n if (child.exitCode !== null || child.signalCode !== null) {\n throw new Error(\"Agent runtime exited while Farm was waiting for it to become ready.\");\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 750);\n try {\n await fetch(healthUrl, {\n signal: controller.signal,\n redirect: \"manual\",\n });\n return;\n } catch {\n await delay(100);\n } finally {\n clearTimeout(timer);\n }\n }\n\n throw new Error(`Agent runtime at ${origin} did not answer before the startup timeout.`);\n}\n\nfunction emitProcessOutput(\n text: string,\n stream: \"stdout\" | \"stderr\",\n onOutput: FarmManagedProcessOptions[\"onOutput\"],\n): void {\n if (!onOutput) return;\n for (const line of text.split(/\\r?\\n/)) {\n const value = line.trimEnd();\n if (value) onOutput(value, stream);\n }\n}\n\nfunction terminateChild(child: ChildProcess): void {\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(\"SIGTERM\");\n }\n}\n\nasync function waitForChildExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) return true;\n return await new Promise<boolean>((resolveExit) => {\n const timer = setTimeout(() => {\n child.off(\"exit\", onExit);\n resolveExit(false);\n }, timeoutMs);\n const onExit = () => {\n clearTimeout(timer);\n resolveExit(true);\n };\n child.once(\"exit\", onExit);\n });\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolveDelay) => setTimeout(resolveDelay, ms));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/agent-runtime.ts"],"sourcesContent":["import { spawn, type ChildProcess } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { defineIntegration, type FarmIntegration } from \"./integrations\";\nimport type { BundleResultPayload, FarmPlugin } from \"./plugin\";\n\nconst AGENT_RUNTIME_METHODS = [\n \"GET\",\n \"HEAD\",\n \"QUERY\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n] as const;\n\nconst HOP_BY_HOP_HEADERS = [\n \"connection\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\",\n] as const;\n\nexport interface FarmAgentRuntimeInstance {\n readonly provider: string;\n readonly routePrefix: string;\n readonly routePrefixes: readonly string[];\n getOrigin(): string | undefined;\n}\n\nexport interface FarmManagedAgentRuntime {\n readonly origin: string;\n readonly process?: ChildProcess;\n stop(): Promise<void>;\n}\n\nexport interface FarmAgentRuntimeStartContext {\n readonly root: string;\n readonly log: {\n info(message: string, meta?: Record<string, unknown>): void;\n warn(message: string, meta?: Record<string, unknown>): void;\n error(message: string, meta?: Record<string, unknown>): void;\n };\n}\n\nexport interface FarmAgentRuntimeBuildContext extends BundleResultPayload {\n readonly provider: string;\n readonly routePrefix: string;\n readonly routePrefixes: readonly string[];\n}\n\nexport interface FarmAgentRuntimeIntegrationOptions {\n provider: string;\n routePrefix: string;\n /** Whether Farm's production server must dispatch this runtime's proxy routes. */\n serverRuntime?: boolean;\n additionalRoutePrefixes?: readonly string[];\n origin?: string;\n originEnv?: string | readonly string[];\n webSockets?: boolean;\n startDev?(context: FarmAgentRuntimeStartContext): Promise<FarmManagedAgentRuntime>;\n afterBuild?(context: FarmAgentRuntimeBuildContext): Promise<void> | void;\n plugins?: readonly FarmPlugin[];\n instance?: Record<string, unknown>;\n}\n\nexport interface FarmManagedProcessOptions {\n command: string;\n args?: readonly string[];\n cwd: string;\n env?: Record<string, string | undefined>;\n label: string;\n origin?: string;\n resolveOrigin?(output: string): string | undefined;\n healthPath?: string;\n timeoutMs?: number;\n stopTimeoutMs?: number;\n onOutput?(line: string, stream: \"stdout\" | \"stderr\"): void;\n}\n\nexport interface FarmAgentProxyOptions {\n fetch?: typeof globalThis.fetch;\n}\n\ninterface RuntimeState {\n origin?: string;\n managed?: FarmManagedAgentRuntime;\n}\n\nexport function createAgentRuntimeIntegration(\n options: FarmAgentRuntimeIntegrationOptions,\n): FarmIntegration {\n const provider = normalizeProviderName(options.provider);\n const routePrefix = normalizeAgentRoutePrefix(options.routePrefix);\n const routePrefixes = [\n routePrefix,\n ...(options.additionalRoutePrefixes || []).map(normalizeAgentRoutePrefix),\n ].filter((prefix, index, values) => values.indexOf(prefix) === index);\n const originEnv = normalizeOriginEnv(options.originEnv);\n const state: RuntimeState = {\n origin: resolveConfiguredOrigin(options.origin, originEnv),\n };\n\n const runtimeInstance: FarmAgentRuntimeInstance & Record<string, unknown> = {\n ...options.instance,\n provider,\n routePrefix,\n routePrefixes,\n getOrigin: () => state.origin ?? resolveConfiguredOrigin(options.origin, originEnv),\n };\n\n const runtimePlugin: FarmPlugin = {\n name: `farm:agent-runtime:${provider}`,\n config(config, context) {\n if (!context.isDev) {\n return config;\n }\n\n const origin = runtimeInstance.getOrigin();\n if (!origin) {\n return config;\n }\n\n for (const prefix of routePrefixes) {\n applyAgentRuntimeViteProxy(config, {\n origin,\n routePrefix: prefix,\n webSockets: options.webSockets,\n });\n }\n return config;\n },\n async afterBundle(result) {\n if (!result.success || !options.afterBuild) {\n return;\n }\n\n await options.afterBuild({\n ...result,\n provider,\n routePrefix,\n routePrefixes,\n });\n },\n };\n\n return defineIntegration({\n category: \"agent\",\n type: provider,\n serverRuntime: options.serverRuntime,\n instance: runtimeInstance,\n async setup(context) {\n if (!context.isDev || state.origin || !options.startDev) {\n return;\n }\n\n state.managed = await options.startDev({\n root: context.appConfig.root || process.cwd(),\n log: context.log,\n });\n state.origin = normalizeAgentOrigin(state.managed.origin);\n context.log.info(`${provider} runtime ready`, {\n origin: state.origin,\n });\n await context.cleanup(async () => {\n await state.managed?.stop();\n state.managed = undefined;\n state.origin = undefined;\n });\n },\n routes: routePrefixes.map((prefix) => ({\n path: `${prefix}/[...farmAgentRuntimePath]`,\n methods: AGENT_RUNTIME_METHODS,\n rawBody: true,\n async handler(request) {\n const origin = runtimeInstance.getOrigin();\n if (!origin) {\n return Response.json(\n {\n error: \"Agent runtime unavailable\",\n provider,\n },\n { status: 503 },\n );\n }\n\n return proxyAgentRuntimeRequest(request, origin);\n },\n })),\n plugins: [runtimePlugin, ...(options.plugins || [])],\n });\n}\n\nexport function applyAgentRuntimeViteProxy(\n config: { vite?: Record<string, any> },\n input: {\n origin: string;\n routePrefix: string;\n webSockets?: boolean;\n },\n): void {\n const origin = normalizeAgentOrigin(input.origin);\n const routePrefix = normalizeAgentRoutePrefix(input.routePrefix);\n const vite = config.vite || {};\n const server = vite.server || {};\n const proxy = server.proxy || {};\n\n if (proxy[routePrefix]) {\n throw new Error(\n `Farm agent runtime cannot own ${routePrefix} because vite.server.proxy already defines it.`,\n );\n }\n\n config.vite = {\n ...vite,\n server: {\n ...server,\n proxy: {\n ...proxy,\n [routePrefix]: {\n target: origin,\n changeOrigin: true,\n ws: input.webSockets === true,\n },\n },\n },\n };\n}\n\nexport async function proxyAgentRuntimeRequest(\n request: Request,\n origin: string,\n options: FarmAgentProxyOptions = {},\n): Promise<Response> {\n const upstreamOrigin = normalizeAgentOrigin(origin);\n const incomingUrl = new URL(request.url);\n const targetUrl = new URL(`${incomingUrl.pathname}${incomingUrl.search}`, upstreamOrigin);\n const headers = createProxyRequestHeaders(request.headers, incomingUrl);\n const method = request.method.toUpperCase();\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n redirect: \"manual\",\n signal: request.signal,\n };\n\n if (method !== \"GET\" && method !== \"HEAD\" && request.body) {\n init.body = request.body;\n init.duplex = \"half\";\n }\n\n try {\n const upstream = await (options.fetch || globalThis.fetch)(targetUrl, init);\n const responseHeaders = new Headers(upstream.headers);\n removeHopByHopHeaders(responseHeaders);\n rewriteProxyLocation(responseHeaders, upstreamOrigin, incomingUrl.origin);\n\n return new Response(upstream.body, {\n status: upstream.status,\n statusText: upstream.statusText,\n headers: responseHeaders,\n });\n } catch (error) {\n if (request.signal.aborted || isAbortError(error)) {\n throw error;\n }\n\n return Response.json(\n {\n error: \"Agent runtime request failed\",\n },\n { status: 502 },\n );\n }\n}\n\nexport async function startManagedAgentRuntime(\n options: FarmManagedProcessOptions,\n): Promise<FarmManagedAgentRuntime> {\n const timeoutMs = options.timeoutMs ?? 30_000;\n const stopTimeoutMs = options.stopTimeoutMs ?? 2_000;\n const fixedOrigin = options.origin ? normalizeAgentOrigin(options.origin) : undefined;\n let output = \"\";\n let settled = false;\n let checkingReadiness = false;\n\n const child = spawn(options.command, [...(options.args || [])], {\n cwd: options.cwd,\n env: {\n ...process.env,\n ...options.env,\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const origin = await new Promise<string>((resolveOrigin, reject) => {\n let timer: ReturnType<typeof setTimeout>;\n\n const finish = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n child.off(\"error\", onError);\n child.off(\"exit\", onExit);\n };\n\n const succeed = async (candidate: string) => {\n if (settled || checkingReadiness) return;\n checkingReadiness = true;\n try {\n const normalized = normalizeAgentOrigin(candidate);\n await waitForAgentRuntime(normalized, options.healthPath, timeoutMs, child);\n finish();\n resolveOrigin(normalized);\n } catch (error) {\n finish();\n terminateChild(child);\n reject(error);\n }\n };\n\n timer = setTimeout(() => {\n finish();\n terminateChild(child);\n reject(new Error(`${options.label} did not become ready within ${timeoutMs}ms.`));\n }, timeoutMs);\n\n const onError = (error: Error) => {\n finish();\n reject(error);\n };\n\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n finish();\n reject(\n new Error(\n `${options.label} exited before it was ready (code ${String(code)}, signal ${String(signal)}).`,\n ),\n );\n };\n\n const onData = (chunk: Buffer, stream: \"stdout\" | \"stderr\") => {\n const text = chunk.toString(\"utf8\");\n output = `${output}${text}`.slice(-16_384);\n emitProcessOutput(text, stream, options.onOutput);\n\n if (!fixedOrigin && options.resolveOrigin) {\n const candidate = options.resolveOrigin(output);\n if (candidate) {\n void succeed(candidate);\n }\n }\n };\n\n child.once(\"error\", onError);\n child.once(\"exit\", onExit);\n child.stdout?.on(\"data\", (chunk: Buffer) => onData(chunk, \"stdout\"));\n child.stderr?.on(\"data\", (chunk: Buffer) => onData(chunk, \"stderr\"));\n\n if (fixedOrigin) {\n void succeed(fixedOrigin);\n }\n });\n\n return {\n origin,\n process: child,\n async stop() {\n if (child.exitCode !== null || child.signalCode !== null) {\n return;\n }\n\n child.kill(\"SIGTERM\");\n const exited = await waitForChildExit(child, stopTimeoutMs);\n if (!exited && child.exitCode === null && child.signalCode === null) {\n child.kill(\"SIGKILL\");\n await waitForChildExit(child, stopTimeoutMs);\n }\n },\n };\n}\n\nexport async function findAvailableAgentRuntimePort(host = \"127.0.0.1\"): Promise<number> {\n return await new Promise<number>((resolvePort, reject) => {\n const server = createNetServer();\n server.unref();\n server.once(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close();\n reject(new Error(\"Unable to allocate an agent runtime port.\"));\n return;\n }\n\n const port = address.port;\n server.close((error) => {\n if (error) reject(error);\n else resolvePort(port);\n });\n });\n });\n}\n\nexport async function resolveProjectPackageBin(\n projectRoot: string,\n packageName: string,\n binName?: string,\n): Promise<string> {\n const root = resolve(projectRoot);\n const projectRequire = createRequire(join(root, \"package.json\"));\n let packageJsonPath: string;\n\n try {\n packageJsonPath = projectRequire.resolve(`${packageName}/package.json`);\n } catch {\n throw new Error(\n `${packageName} is required by this agent integration. Install it in ${root} and try again.`,\n );\n }\n\n const packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n const bin =\n typeof packageJson.bin === \"string\"\n ? packageJson.bin\n : packageJson.bin?.[binName || packageName.split(\"/\").at(-1) || packageName];\n\n if (!bin) {\n throw new Error(\n `${packageName} does not expose the expected ${binName || packageName} binary.`,\n );\n }\n\n const packageRoot = dirname(packageJsonPath);\n const binaryPath = resolve(packageRoot, bin);\n if (\n relative(packageRoot, binaryPath).startsWith(\"..\") ||\n isAbsolute(relative(packageRoot, binaryPath))\n ) {\n throw new Error(`${packageName} exposes a binary outside its package root.`);\n }\n\n return binaryPath;\n}\n\nexport function normalizeAgentOrigin(value: string): string {\n const input = value.trim();\n if (!input) {\n throw new Error(\"Agent runtime origin cannot be empty.\");\n }\n\n const url = new URL(input);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"Agent runtime origin must use http or https.\");\n }\n if (url.username || url.password) {\n throw new Error(\"Agent runtime origin cannot contain credentials.\");\n }\n if (url.pathname !== \"/\" || url.search || url.hash) {\n throw new Error(\"Agent runtime origin must not contain a path, query, or hash.\");\n }\n\n return url.origin;\n}\n\nexport function normalizeAgentRoutePrefix(value: string): string {\n const normalized = `/${value.trim()}`.replace(/\\/{2,}/g, \"/\");\n if (normalized === \"/\") {\n throw new Error(\"Agent runtime route prefix cannot own the application root.\");\n }\n return normalized.replace(/\\/$/, \"\");\n}\n\nfunction normalizeProviderName(value: string): string {\n const provider = value.trim();\n if (!provider || !/^[a-z0-9][a-z0-9._-]*$/i.test(provider)) {\n throw new Error(\"Agent runtime provider must be a non-empty package-style name.\");\n }\n return provider;\n}\n\nfunction normalizeOriginEnv(value: string | readonly string[] | undefined): readonly string[] {\n if (!value) return [];\n return (Array.isArray(value) ? value : [value]).map((entry) => entry.trim()).filter(Boolean);\n}\n\nfunction resolveConfiguredOrigin(\n configuredOrigin: string | undefined,\n envNames: readonly string[],\n): string | undefined {\n if (configuredOrigin) {\n return normalizeAgentOrigin(configuredOrigin);\n }\n\n for (const envName of envNames) {\n const value = process.env[envName];\n if (value?.trim()) {\n return normalizeAgentOrigin(value);\n }\n }\n\n return undefined;\n}\n\nfunction createProxyRequestHeaders(input: Headers, incomingUrl: URL): Headers {\n const headers = new Headers(input);\n removeHopByHopHeaders(headers);\n headers.delete(\"host\");\n headers.delete(\"content-length\");\n headers.delete(\"accept-encoding\");\n if (!headers.has(\"x-forwarded-host\")) headers.set(\"x-forwarded-host\", incomingUrl.host);\n if (!headers.has(\"x-forwarded-proto\")) {\n headers.set(\"x-forwarded-proto\", incomingUrl.protocol.replace(\":\", \"\"));\n }\n return headers;\n}\n\nfunction removeHopByHopHeaders(headers: Headers): void {\n const connectionOptions = headers.get(\"connection\")?.split(\",\") ?? [];\n for (const option of connectionOptions) {\n const header = option.trim();\n if (/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(header)) {\n headers.delete(header);\n }\n }\n\n for (const header of HOP_BY_HOP_HEADERS) {\n headers.delete(header);\n }\n}\n\nfunction rewriteProxyLocation(\n headers: Headers,\n upstreamOrigin: string,\n incomingOrigin: string,\n): void {\n const location = headers.get(\"location\");\n if (!location) return;\n\n try {\n const url = new URL(location, upstreamOrigin);\n if (url.origin === upstreamOrigin) {\n headers.set(\"location\", `${incomingOrigin}${url.pathname}${url.search}${url.hash}`);\n }\n } catch {\n // Preserve non-URL Location values exactly as returned by the runtime.\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nasync function waitForAgentRuntime(\n origin: string,\n healthPath: string | undefined,\n timeoutMs: number,\n child: ChildProcess,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n const healthUrl = new URL(healthPath || \"/\", origin);\n\n while (Date.now() < deadline) {\n if (child.exitCode !== null || child.signalCode !== null) {\n throw new Error(\"Agent runtime exited while Farm was waiting for it to become ready.\");\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 750);\n try {\n await fetch(healthUrl, {\n signal: controller.signal,\n redirect: \"manual\",\n });\n return;\n } catch {\n await delay(100);\n } finally {\n clearTimeout(timer);\n }\n }\n\n throw new Error(`Agent runtime at ${origin} did not answer before the startup timeout.`);\n}\n\nfunction emitProcessOutput(\n text: string,\n stream: \"stdout\" | \"stderr\",\n onOutput: FarmManagedProcessOptions[\"onOutput\"],\n): void {\n if (!onOutput) return;\n for (const line of text.split(/\\r?\\n/)) {\n const value = line.trimEnd();\n if (value) onOutput(value, stream);\n }\n}\n\nfunction terminateChild(child: ChildProcess): void {\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(\"SIGTERM\");\n }\n}\n\nasync function waitForChildExit(child: ChildProcess, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) return true;\n return await new Promise<boolean>((resolveExit) => {\n const timer = setTimeout(() => {\n child.off(\"exit\", onExit);\n resolveExit(false);\n }, timeoutMs);\n const onExit = () => {\n clearTimeout(timer);\n resolveExit(true);\n };\n child.once(\"exit\", onExit);\n });\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolveDelay) => setTimeout(resolveDelay, ms));\n}\n"],"mappings":"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","names":[]}
@@ -301,6 +301,8 @@ declare class ServerRenderer {
301
301
  constructor(config: Required<FarmConfig>, routeManager: RouteManager, i18nRuntime?: FarmI18nRuntime, viteServer?: ViteDevServer);
302
302
  initialize(): Promise<void>;
303
303
  private createPageBoundary;
304
+ private collectDevStyleHrefs;
305
+ private collectDevStyleLinks;
304
306
  private createLayoutBoundary;
305
307
  private renderElementToCompleteHTML;
306
308
  /**
@@ -301,6 +301,8 @@ declare class ServerRenderer {
301
301
  constructor(config: Required<FarmConfig>, routeManager: RouteManager, i18nRuntime?: FarmI18nRuntime, viteServer?: ViteDevServer);
302
302
  initialize(): Promise<void>;
303
303
  private createPageBoundary;
304
+ private collectDevStyleHrefs;
305
+ private collectDevStyleLinks;
304
306
  private createLayoutBoundary;
305
307
  private renderElementToCompleteHTML;
306
308
  /**
@@ -232,7 +232,7 @@ import {
232
232
  } from "./chunk-ZRBCBOEX.mjs";
233
233
  import {
234
234
  FARM_VERSION
235
- } from "./chunk-IIKQBOGZ.mjs";
235
+ } from "./chunk-PZLBMD63.mjs";
236
236
  import {
237
237
  FARM_CONFIG_REWRITES_PLUGIN_NAME
238
238
  } from "./chunk-I3FMD5VJ.mjs";
@@ -2843,6 +2843,25 @@ __name(safeGlobFiles, "safeGlobFiles");
2843
2843
  import * as fs4 from "fs";
2844
2844
  import * as path7 from "path";
2845
2845
 
2846
+ // src/server/dev-styles.ts
2847
+ var STYLE_EXTENSIONS = /\.(css|scss|sass|less|styl|stylus)(?:$|\?)/;
2848
+ var ALREADY_LINKED = "/src/app/globals.css";
2849
+ function collectDevStylesheetUrls(modules) {
2850
+ const seen = /* @__PURE__ */ new Set();
2851
+ for (const mod of modules) {
2852
+ const id = mod.id ?? mod.file ?? "";
2853
+ if (!STYLE_EXTENSIONS.test(id)) continue;
2854
+ if (id.includes(".module.")) continue;
2855
+ const url = mod.url;
2856
+ if (!url || !url.startsWith("/")) continue;
2857
+ const bare = url.split("?")[0];
2858
+ if (bare === ALREADY_LINKED) continue;
2859
+ seen.add(bare);
2860
+ }
2861
+ return [...seen].sort();
2862
+ }
2863
+ __name(collectDevStylesheetUrls, "collectDevStylesheetUrls");
2864
+
2846
2865
  // src/server/full-document.ts
2847
2866
  function stripContentsWrappers(markup) {
2848
2867
  let out = markup.replace(/^\s+/, "");
@@ -4222,6 +4241,12 @@ __name(createDefaultErrorDiagnostics, "createDefaultErrorDiagnostics");
4222
4241
  // src/server/renderer.ts
4223
4242
  var cachedClerkProvider = null;
4224
4243
  var importRuntimeModule = new Function("specifier", "return import(specifier);");
4244
+ function shouldServePrerenderedPage(nodeEnv, method) {
4245
+ if (nodeEnv !== "production") return false;
4246
+ const normalizedMethod = (method || "GET").toUpperCase();
4247
+ return normalizedMethod === "GET" || normalizedMethod === "HEAD";
4248
+ }
4249
+ __name(shouldServePrerenderedPage, "shouldServePrerenderedPage");
4225
4250
  function formatSSGManifestError(error) {
4226
4251
  return error instanceof Error ? error.message : String(error);
4227
4252
  }
@@ -4493,6 +4518,18 @@ var _ServerRenderer = class _ServerRenderer {
4493
4518
  pageElement
4494
4519
  );
4495
4520
  }
4521
+ /// Stylesheets the app imported through JS (fontsource packages, component
4522
+ /// CSS) that the document must link alongside globals.css — see #658.
4523
+ collectDevStyleHrefs() {
4524
+ const graph = this.viteServer?.moduleGraph;
4525
+ if (!graph) return [];
4526
+ return collectDevStylesheetUrls(graph.idToModuleMap.values());
4527
+ }
4528
+ collectDevStyleLinks() {
4529
+ return this.collectDevStyleHrefs().map(
4530
+ (href) => `<link rel="stylesheet" href="${escapeHtmlAttribute2(href)}">`
4531
+ );
4532
+ }
4496
4533
  createLayoutBoundary(pattern, layoutElement) {
4497
4534
  return this.rendererRuntime.createElement(
4498
4535
  "div",
@@ -4925,7 +4962,7 @@ var _ServerRenderer = class _ServerRenderer {
4925
4962
  return;
4926
4963
  }
4927
4964
  }
4928
- if (process.env.NODE_ENV === "production") {
4965
+ if (shouldServePrerenderedPage(process.env.NODE_ENV, req.method)) {
4929
4966
  const ssgPage = await this.shouldServeSSG(pathname);
4930
4967
  if (ssgPage) {
4931
4968
  const served = await this.serveSSGPage(req, res, ssgPage);
@@ -5707,7 +5744,11 @@ var _ServerRenderer = class _ServerRenderer {
5707
5744
  {
5708
5745
  tag: "link",
5709
5746
  attrs: { rel: "stylesheet", href: "/src/app/globals.css" }
5710
- }
5747
+ },
5748
+ ...this.collectDevStyleHrefs().map((href) => ({
5749
+ tag: "link",
5750
+ attrs: { rel: "stylesheet", href }
5751
+ }))
5711
5752
  ]
5712
5753
  };
5713
5754
  for (const routeEntry of manifest.routes) {
@@ -5803,6 +5844,7 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
5803
5844
  rendererHead,
5804
5845
  renderFarmFontDevHead(this.config.root || process.cwd()),
5805
5846
  `<link rel="stylesheet" href="/src/app/globals.css">`,
5847
+ ...this.collectDevStyleLinks(),
5806
5848
  `<script type="module" src="/@vite/client"></script>`,
5807
5849
  rendererHydrationScript,
5808
5850
  bootstrapScript
@@ -5821,7 +5863,8 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
5821
5863
  ${documentTitleTag}${metaTags}${alternateTags}${rendererHead ? `
5822
5864
  ${rendererHead}` : ""}
5823
5865
  ${renderFarmFontDevHead(this.config.root || process.cwd())}
5824
- <link rel="stylesheet" href="/src/app/globals.css">
5866
+ <link rel="stylesheet" href="/src/app/globals.css">${this.collectDevStyleLinks().map((l) => `
5867
+ ${l}`).join("")}
5825
5868
  <script type="module" src="/@vite/client"></script>
5826
5869
  ${rendererHydrationScript}
5827
5870
  ${bootstrapScript}
@@ -5886,7 +5929,11 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
5886
5929
  {
5887
5930
  tag: "link",
5888
5931
  attrs: { rel: "stylesheet", href: "/src/app/globals.css" }
5889
- }
5932
+ },
5933
+ ...this.collectDevStyleHrefs().map((href) => ({
5934
+ tag: "link",
5935
+ attrs: { rel: "stylesheet", href }
5936
+ }))
5890
5937
  ]
5891
5938
  };
5892
5939
  for (const routeEntry of manifest.routes) {
@@ -5973,6 +6020,7 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
5973
6020
  { style: { display: "contents" } },
5974
6021
  element
5975
6022
  );
6023
+ const devStyleLinks = this.collectDevStyleLinks();
5976
6024
  const { pipe } = renderToPipeableStream(streamRoot, {
5977
6025
  onShellReady() {
5978
6026
  const shellReadyMs = Date.now() - streamStartTime;
@@ -5994,7 +6042,8 @@ ${getFarmI18nClientSnapshot() ? `window.__FARM_I18N__ = ${serializeInlineValue(g
5994
6042
  ${hasFavicon ? "" : '<link rel="icon" href="data:,">'}
5995
6043
  <title>${title}</title>${metaTags}${i18nAlternateTags}
5996
6044
  ${fontHead}
5997
- <link rel="stylesheet" href="/src/app/globals.css" />
6045
+ <link rel="stylesheet" href="/src/app/globals.css" />${devStyleLinks.map((l) => `
6046
+ ${l}`).join("")}
5998
6047
  <script type="module" src="/@vite/client"></script>
5999
6048
  ${propsScript}
6000
6049
  ${hydrationClickQueueScript}
@@ -6221,6 +6270,7 @@ ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue(i18nSnapshot)};`
6221
6270
  alternateLinks,
6222
6271
  fontHead,
6223
6272
  `<link rel="stylesheet" href="/src/app/globals.css" />`,
6273
+ ...this.collectDevStyleLinks(),
6224
6274
  `<script type="module" src="/@vite/client"></script>`,
6225
6275
  rendererHydrationScript,
6226
6276
  integrationManifestScript
@@ -6238,7 +6288,8 @@ ${i18nSnapshot ? `window.__FARM_I18N__ = ${serializeInlineValue(i18nSnapshot)};`
6238
6288
  <link rel="icon" href="data:,">
6239
6289
  <title>${escapeHtmlAttribute2(documentTitle)}</title>${alternateLinks}
6240
6290
  ${fontHead}
6241
- <link rel="stylesheet" href="/src/app/globals.css" />
6291
+ <link rel="stylesheet" href="/src/app/globals.css" />${this.collectDevStyleLinks().map((l) => `
6292
+ ${l}`).join("")}
6242
6293
  <script type="module" src="/@vite/client"></script>
6243
6294
  ${rendererHydrationScript}
6244
6295
  ${integrationManifestScript}
@@ -11907,4 +11958,4 @@ export {
11907
11958
  farmPlugin,
11908
11959
  defineConfig
11909
11960
  };
11910
- //# sourceMappingURL=chunk-S6FO7OXA.mjs.map
11961
+ //# sourceMappingURL=chunk-BF47GPQF.mjs.map