@farm.js/core 0.1.25 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/agent-runtime.d.mts +2 -2
  2. package/dist/agent-runtime.d.ts +2 -2
  3. package/dist/api/route-manager.d.mts +2 -2
  4. package/dist/api/route-manager.d.ts +2 -2
  5. package/dist/api.d.mts +3 -3
  6. package/dist/api.d.ts +3 -3
  7. package/dist/{app-ZuWrAMc_.d.mts → app-29vG5tmY.d.mts} +3 -3
  8. package/dist/{app-BF-ctoxh.d.ts → app-Cx71s_PT.d.ts} +3 -3
  9. package/dist/app-markdown.cjs +6 -4
  10. package/dist/app-markdown.d.mts +3 -3
  11. package/dist/app-markdown.d.ts +3 -3
  12. package/dist/app-markdown.mjs +5 -3
  13. package/dist/{chunk-E3RDL2DA.cjs → chunk-2CT6XUNO.cjs} +61 -31
  14. package/dist/{chunk-R7LCG3BT.cjs → chunk-3TQG7CGC.cjs} +84 -77
  15. package/dist/{chunk-AXYTGLF3.cjs → chunk-3WSWXPYM.cjs} +4 -4
  16. package/dist/{chunk-2BIJGZR3.mjs → chunk-74RZNRY6.mjs} +1 -1
  17. package/dist/{chunk-TTVHACQV.cjs → chunk-ALIFMS4A.cjs} +1 -1
  18. package/dist/{chunk-T2OPSH6S.mjs → chunk-ARXCHQLX.mjs} +9 -2
  19. package/dist/{chunk-2KI3CL3N.mjs → chunk-DU2CASV6.mjs} +1 -1
  20. package/dist/chunk-J63ZH5OQ.cjs +62 -0
  21. package/dist/{chunk-XM4ZDVD7.mjs → chunk-JM5GQL4H.mjs} +1 -1
  22. package/dist/{chunk-6VEHUKZ2.mjs → chunk-MM5D6VLP.mjs} +4 -20
  23. package/dist/chunk-MVL2RAJW.mjs +62 -0
  24. package/dist/{chunk-YA6LLTIJ.cjs → chunk-ND224OE2.cjs} +4 -20
  25. package/dist/{chunk-XME4TCLB.mjs → chunk-OFKG57MZ.mjs} +2 -2
  26. package/dist/{chunk-U4MP7XTD.mjs → chunk-OOIL3BWR.mjs} +168 -16
  27. package/dist/{chunk-WOI2HOGA.mjs → chunk-PPIW3MH6.mjs} +1 -1
  28. package/dist/{chunk-2ITKVAIF.cjs → chunk-QIH2HD6H.cjs} +191 -39
  29. package/dist/{chunk-65P6OGYN.cjs → chunk-QJ4D3UKJ.cjs} +10 -3
  30. package/dist/{chunk-RYDW7GPR.cjs → chunk-QLXEYIAW.cjs} +13 -13
  31. package/dist/{chunk-WJYCI56T.mjs → chunk-QPPQHB6X.mjs} +43 -30
  32. package/dist/{chunk-RR6UGYUT.mjs → chunk-RAI7NULA.mjs} +39 -9
  33. package/dist/{chunk-6K4SPQWL.cjs → chunk-RCYINC4A.cjs} +3 -3
  34. package/dist/{chunk-QYMRIVG6.cjs → chunk-SZ4LYNUX.cjs} +110 -97
  35. package/dist/{chunk-N2Z4ZFDE.mjs → chunk-UXQXGB5A.mjs} +19 -12
  36. package/dist/{chunk-CFNOGDUS.cjs → chunk-W2HZKYES.cjs} +2 -2
  37. package/dist/{chunk-O5DVPF3R.cjs → chunk-WFPRVVF2.cjs} +10 -10
  38. package/dist/{chunk-5YYJ6Q2L.mjs → chunk-YMUH2BLR.mjs} +2 -2
  39. package/dist/{client-plugins-DPG0NeZN.d.mts → client-plugins-B8RPJnot.d.mts} +90 -3
  40. package/dist/{client-plugins-Fgni-_25.d.ts → client-plugins-bPBf4haK.d.ts} +90 -3
  41. package/dist/client-plugins.d.mts +2 -2
  42. package/dist/client-plugins.d.ts +2 -2
  43. package/dist/client.d.mts +6 -6
  44. package/dist/client.d.ts +6 -6
  45. package/dist/config.d.mts +2 -2
  46. package/dist/config.d.ts +2 -2
  47. package/dist/{devtools-I7TBFOKD.mjs → devtools-5D4ZDRPR.mjs} +5 -3
  48. package/dist/{devtools-6OA7FEF6.cjs → devtools-QZJEUOJW.cjs} +6 -4
  49. package/dist/docs.cjs +8 -6
  50. package/dist/docs.mjs +7 -5
  51. package/dist/index.cjs +17 -13
  52. package/dist/index.d.mts +13 -13
  53. package/dist/index.d.ts +13 -13
  54. package/dist/index.mjs +16 -12
  55. package/dist/integrations.d.mts +2 -2
  56. package/dist/integrations.d.ts +2 -2
  57. package/dist/internal/app-markdown-runtime.cjs +5 -3
  58. package/dist/internal/app-markdown-runtime.d.mts +2 -2
  59. package/dist/internal/app-markdown-runtime.d.ts +2 -2
  60. package/dist/internal/app-markdown-runtime.mjs +4 -2
  61. package/dist/internal/build-runtime.cjs +14 -13
  62. package/dist/internal/build-runtime.d.mts +4 -4
  63. package/dist/internal/build-runtime.d.ts +4 -4
  64. package/dist/internal/build-runtime.mjs +13 -12
  65. package/dist/internal/cli-runtime.cjs +6 -5
  66. package/dist/internal/cli-runtime.mjs +5 -4
  67. package/dist/internal/client-error-overlay.cjs +4 -4
  68. package/dist/internal/client-error-overlay.mjs +1 -1
  69. package/dist/internal/compression-runtime.d.mts +2 -2
  70. package/dist/internal/compression-runtime.d.ts +2 -2
  71. package/dist/internal/config-runtime.cjs +6 -4
  72. package/dist/internal/config-runtime.d.mts +3 -3
  73. package/dist/internal/config-runtime.d.ts +3 -3
  74. package/dist/internal/config-runtime.mjs +5 -3
  75. package/dist/internal/infra-analytics-runtime.cjs +4 -3
  76. package/dist/internal/infra-analytics-runtime.mjs +2 -1
  77. package/dist/internal/product-telemetry-runtime.cjs +2 -2
  78. package/dist/internal/product-telemetry-runtime.mjs +1 -1
  79. package/dist/internal/production-runtime.cjs +5 -4
  80. package/dist/internal/production-runtime.d.mts +11 -9
  81. package/dist/internal/production-runtime.d.ts +11 -9
  82. package/dist/internal/production-runtime.mjs +4 -3
  83. package/dist/markdown.cjs +4 -2
  84. package/dist/markdown.mjs +3 -1
  85. package/dist/{metadata-D0EF7esB.d.mts → metadata-C3na4CBj.d.mts} +1 -1
  86. package/dist/{metadata-CDnRHKVq.d.ts → metadata-CzBP4Mfp.d.ts} +1 -1
  87. package/dist/middleware.d.mts +4 -4
  88. package/dist/middleware.d.ts +4 -4
  89. package/dist/navigation.d.mts +5 -5
  90. package/dist/navigation.d.ts +5 -5
  91. package/dist/observability-BupkiN0m.d.mts +447 -0
  92. package/dist/observability-BupkiN0m.d.ts +447 -0
  93. package/dist/observability.d.mts +2 -417
  94. package/dist/observability.d.ts +2 -417
  95. package/dist/plugin.cjs +9 -8
  96. package/dist/plugin.d.mts +2 -2
  97. package/dist/plugin.d.ts +2 -2
  98. package/dist/plugin.mjs +8 -7
  99. package/dist/{production-runtime-DpCt0opU.d.ts → production-runtime-CYg4wM4E.d.ts} +1 -1
  100. package/dist/{production-runtime-x3W4wVqx.d.mts → production-runtime-DP94hPGe.d.mts} +1 -1
  101. package/dist/{render-plan-D5oFRVBV.d.ts → render-plan-Bl6Fzg5z.d.ts} +1 -1
  102. package/dist/{render-plan-tazUJalK.d.mts → render-plan-CKAJg0jC.d.mts} +1 -1
  103. package/dist/renderer-client.d.mts +4 -4
  104. package/dist/renderer-client.d.ts +4 -4
  105. package/dist/{request-CzZX0Aew.d.ts → request-CR-Bp1Px.d.ts} +1 -1
  106. package/dist/{request-CXmQy5ks.d.mts → request-CrBCcPZZ.d.mts} +1 -1
  107. package/dist/request.d.mts +3 -3
  108. package/dist/request.d.ts +3 -3
  109. package/dist/{route-rendering-B-qpe32B.d.mts → route-rendering-C1NAHo-C.d.mts} +1 -1
  110. package/dist/{route-rendering-Dw3C362T.d.ts → route-rendering-CZH5FegB.d.ts} +1 -1
  111. package/dist/{router-CafM2jlw.d.mts → router-B57eDJ3u.d.mts} +1 -1
  112. package/dist/{router-CLl3xHwl.d.ts → router-Cg_kD3Bd.d.ts} +1 -1
  113. package/dist/routes.d.mts +2 -2
  114. package/dist/routes.d.ts +2 -2
  115. package/dist/server-plugins.d.mts +3 -3
  116. package/dist/server-plugins.d.ts +3 -3
  117. package/dist/server.cjs +159 -102
  118. package/dist/server.d.mts +8 -8
  119. package/dist/server.d.ts +8 -8
  120. package/dist/server.mjs +140 -83
  121. package/dist/{spa-router-DePr2aZ6.d.ts → spa-router-BstQUO6Q.d.ts} +2 -2
  122. package/dist/{spa-router-6sJfsMlQ.d.mts → spa-router-DTdbuinx.d.mts} +2 -2
  123. package/dist/testing.d.mts +2 -2
  124. package/dist/testing.d.ts +2 -2
  125. package/dist/{utils-BPHr-1mP.d.mts → utils-CS3ZLnEJ.d.mts} +1 -1
  126. package/dist/{utils-BBKC3cf3.d.ts → utils-D3rdsIvM.d.ts} +1 -1
  127. package/dist/version.cjs +2 -2
  128. package/dist/version.mjs +1 -1
  129. package/dist/vite.cjs +9 -8
  130. package/dist/vite.d.mts +2 -2
  131. package/dist/vite.d.ts +2 -2
  132. package/dist/vite.mjs +8 -7
  133. package/package.json +1 -1
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  compileFarmDocsAdapterEdgeManifest,
9
9
  createFarmDocsAPIHandler
10
- } from "./chunk-XME4TCLB.mjs";
10
+ } from "./chunk-OFKG57MZ.mjs";
11
11
  import {
12
12
  FARM_DOCS_LAST_MODIFIED_MANIFEST,
13
13
  createFarmDocsHandler,
@@ -17,7 +17,7 @@ import {
17
17
  loadFarmDocsPage,
18
18
  resolveFarmDocsContentDir,
19
19
  toFarmDocsMarkdownPage
20
- } from "./chunk-2KI3CL3N.mjs";
20
+ } from "./chunk-DU2CASV6.mjs";
21
21
  import {
22
22
  generateFarmDocsSearchClientRuntime,
23
23
  isFarmDocsSearchEnabled,
@@ -25,7 +25,7 @@ import {
25
25
  } from "./chunk-UP4CW6WP.mjs";
26
26
  import {
27
27
  FARM_PRERENDER_ENV
28
- } from "./chunk-6VEHUKZ2.mjs";
28
+ } from "./chunk-MM5D6VLP.mjs";
29
29
  import {
30
30
  loadFarmDocsEngine
31
31
  } from "./chunk-2VQKKQ6D.mjs";
@@ -34,7 +34,7 @@ import {
34
34
  getDeployTargetForPreset,
35
35
  hasCustomFarmRouteContext,
36
36
  resolveDeployOutputPath
37
- } from "./chunk-5YYJ6Q2L.mjs";
37
+ } from "./chunk-YMUH2BLR.mjs";
38
38
  import {
39
39
  resolveFarmInstrumentationFile
40
40
  } from "./chunk-ZZSRYEYU.mjs";
@@ -44,6 +44,7 @@ import {
44
44
  import {
45
45
  DEFAULT_NOT_FOUND_STYLES,
46
46
  FARM_LAYOUT_ELEMENT_CLIENT_SOURCE,
47
+ HOISTED_HEAD_ELEMENT,
47
48
  PluginManager,
48
49
  SHARP_INSTALL_HINT,
49
50
  createFarmApp,
@@ -69,7 +70,7 @@ import {
69
70
  resolveFarmImageProviderForRuntime,
70
71
  resolveFarmIsolatedClientHydrationMode,
71
72
  resolveFarmNotFoundComponentPath
72
- } from "./chunk-N2Z4ZFDE.mjs";
73
+ } from "./chunk-UXQXGB5A.mjs";
73
74
  import {
74
75
  findRequestBoundSourceBlockers,
75
76
  generateFarmTypeArtifacts,
@@ -79,7 +80,7 @@ import {
79
80
  import {
80
81
  FARM_API_CATALOG_PATH,
81
82
  resolveFarmApiCatalogInput
82
- } from "./chunk-T2OPSH6S.mjs";
83
+ } from "./chunk-ARXCHQLX.mjs";
83
84
  import {
84
85
  isFarmPreviewDeploymentEnvironment
85
86
  } from "./chunk-BOYNDCZL.mjs";
@@ -111,7 +112,7 @@ import {
111
112
  } from "./chunk-DAATZTKJ.mjs";
112
113
  import {
113
114
  applyFarmCspHashesToHtml
114
- } from "./chunk-RR6UGYUT.mjs";
115
+ } from "./chunk-RAI7NULA.mjs";
115
116
  import {
116
117
  applyFarmCronVercelCrons,
117
118
  createFarmCronCloudflareConfig,
@@ -123,14 +124,14 @@ import {
123
124
  } from "./chunk-4OOBRCJX.mjs";
124
125
  import {
125
126
  isFarmMarkdownPageFile
126
- } from "./chunk-XM4ZDVD7.mjs";
127
+ } from "./chunk-JM5GQL4H.mjs";
127
128
  import {
128
129
  resolveFarmMdxComponentsModulePath,
129
130
  resolveMdxConfig
130
131
  } from "./chunk-FA2W42OV.mjs";
131
132
  import {
132
133
  getFarmMarkdownAlternatePath
133
- } from "./chunk-U4MP7XTD.mjs";
134
+ } from "./chunk-OOIL3BWR.mjs";
134
135
  import {
135
136
  applyFarmWorkflowVercelCrons,
136
137
  prepareFarmWorkflowsForNitro
@@ -6325,12 +6326,13 @@ function stripFarmDocumentWrappers(markup) {
6325
6326
  }
6326
6327
 
6327
6328
  // Farm's display:contents wrappers, and the head elements React 19 hoists in front of them
6328
- // (charset, viewport, preloads, titles) when the layout's <html> is not the render root.
6329
+ // (charset, viewport, preloads, titles, async scripts, precedence styles) when the layout's
6330
+ // <html> is not the render root. The hoistable pattern is shared with the dev renderer.
6329
6331
  function peelFarmDocumentPrefix(markup) {
6330
6332
  let inner = markup.replace(/^\\s+/, "");
6331
6333
  let hoisted = "";
6332
6334
  const wrapper = /^<div\\b[^>]*style=["']display\\s*:\\s*contents["'][^>]*>/i;
6333
- const hoistable = /^(?:<(?:meta|link|base)\\b[^>]*>|<title\\b[^>]*>[\\s\\S]*?<\\/title>)/i;
6335
+ const hoistable = /${HOISTED_HEAD_ELEMENT.source}/i;
6334
6336
  let match;
6335
6337
  while ((match = wrapper.exec(inner) || hoistable.exec(inner))) {
6336
6338
  if (!/^<div/i.test(match[0])) hoisted += match[0];
@@ -6842,7 +6844,7 @@ async function handleApplicationMetadataRouteRequest(request, routePathname) {
6842
6844
  const body = isLlmsFull && !(value instanceof Response)
6843
6845
  ? await renderFarmLlmsFullTxt(value, { origin: url.origin, readMarkdown: llmsContext.markdown })
6844
6846
  : value;
6845
- return createFarmMetadataRouteResponse(match.metadata.kind, body, routeModule, { method });
6847
+ return createFarmMetadataRouteResponse(match.metadata.kind, body, routeModule, { method, request });
6846
6848
  } catch (error) {
6847
6849
  console.error("Metadata route render failed:", error);
6848
6850
  return new Response("Internal Server Error", {
@@ -7647,7 +7649,7 @@ async function handleFarmRequestInContext(
7647
7649
  // agent.apiCatalog: list the OpenAPI and MCP surfaces at the RFC 9727 path.
7648
7650
  if (normalizeRuntimePath(routePathname) === ${JSON.stringify(FARM_API_CATALOG_PATH)}) {
7649
7651
  return applyProductionMiddlewareHeaders(
7650
- createFarmApiCatalogResponse(request.method, farmApiCatalogInput),
7652
+ createFarmApiCatalogResponse(request.method, farmApiCatalogInput, request),
7651
7653
  middlewareHeaders,
7652
7654
  );
7653
7655
  }
@@ -7669,26 +7671,34 @@ async function handleFarmRequestInContext(
7669
7671
  if (farmGeneratedLlmsKind) {
7670
7672
  const llmsContext = createFarmLlmsTxtContext(request, farmGeneratedLlmsKind === "llms-full");
7671
7673
  const llmsOrigin = new URL(request.url).origin;
7672
- const renderLlmsFull = () =>
7674
+ // A page that times out is left out, the shared render is not reused, and
7675
+ // the partial response is not cacheable.
7676
+ let llmsComplete = true;
7677
+ const renderLlmsFull = (shared) =>
7673
7678
  renderFarmLlmsFullTxt(llmsContext.defaults, {
7674
7679
  origin: llmsOrigin,
7675
7680
  readMarkdown: llmsContext.markdown,
7681
+ onIncomplete: () => {
7682
+ llmsComplete = false;
7683
+ if (shared) shared.incomplete();
7684
+ },
7676
7685
  });
7677
7686
  // HEAD reads no pages, so it neither waits for nor fills the shared render.
7678
7687
  const llmsBody = farmGeneratedLlmsKind !== "llms-full"
7679
7688
  ? llmsContext.defaults
7680
7689
  : request.method.toUpperCase() === "HEAD"
7681
7690
  ? await renderLlmsFull()
7682
- : await farmLlmsFullRenderer(llmsOrigin, renderLlmsFull);
7683
- return applyProductionMiddlewareHeaders(
7684
- createFarmMetadataRouteResponse(
7685
- farmGeneratedLlmsKind,
7686
- llmsBody,
7687
- { revalidate: farmLlmsTxtConfig.revalidate },
7688
- { method: request.method },
7689
- ),
7690
- middlewareHeaders,
7691
+ : await farmLlmsFullRenderer(llmsOrigin, renderLlmsFull, (complete) => {
7692
+ llmsComplete = complete;
7693
+ });
7694
+ const llmsResponse = createFarmMetadataRouteResponse(
7695
+ farmGeneratedLlmsKind,
7696
+ llmsBody,
7697
+ { revalidate: llmsComplete ? farmLlmsTxtConfig.revalidate : 0 },
7698
+ { method: request.method, request },
7691
7699
  );
7700
+ if (!llmsComplete) llmsResponse.headers.set("cache-control", "no-store");
7701
+ return applyProductionMiddlewareHeaders(llmsResponse, middlewareHeaders);
7692
7702
  }
7693
7703
  ` : ""}
7694
7704
 
@@ -9340,13 +9350,16 @@ export default async function farmNitroEventHandler(event) {
9340
9350
  const alternatePath = getFarmMarkdownAlternatePath(config.md, route.route);
9341
9351
  if (!alternatePath) return;
9342
9352
  const routeRule = nitroInstance.options.routeRules[route.route] || {};
9343
- nitroInstance.options.routeRules[route.route] = {
9344
- ...routeRule,
9345
- headers: {
9346
- ...routeRule.headers,
9347
- Link: `<${alternatePath}>; rel="alternate"; type="text/markdown"`
9348
- }
9349
- };
9353
+ const alternate = `<${alternatePath}>; rel="alternate"; type="text/markdown"`;
9354
+ const headers = { ...routeRule.headers };
9355
+ let link;
9356
+ for (const key of Object.keys(headers)) {
9357
+ if (key.toLowerCase() !== "link") continue;
9358
+ link = link ? `${link}, ${headers[key]}` : headers[key];
9359
+ delete headers[key];
9360
+ }
9361
+ headers.Link = !link ? alternate : link.includes(alternate) ? link : `${link}, ${alternate}`;
9362
+ nitroInstance.options.routeRules[route.route] = { ...routeRule, headers };
9350
9363
  });
9351
9364
  nitroInstance.hooks.hook("prerender:done", () => {
9352
9365
  nitroInstance.routing.sync();
@@ -2,7 +2,10 @@ import {
2
2
  getFarmMarkdownMirrorPath,
3
3
  isFarmMarkdownMirrorExposed,
4
4
  matchesFarmMarkdownRoutePattern
5
- } from "./chunk-U4MP7XTD.mjs";
5
+ } from "./chunk-OOIL3BWR.mjs";
6
+ import {
7
+ FARM_INTERNAL_READ_HEADER
8
+ } from "./chunk-MVL2RAJW.mjs";
6
9
  import {
7
10
  applyFarmBasePath
8
11
  } from "./chunk-4RB44K6Z.mjs";
@@ -158,7 +161,9 @@ function createFarmLlmsMarkdownReader(fetchMarkdown) {
158
161
  return async (url) => {
159
162
  try {
160
163
  const response = await fetchMarkdown(
161
- new Request(url, { headers: { accept: "text/markdown" } })
164
+ new Request(url, {
165
+ headers: { accept: "text/markdown", [FARM_INTERNAL_READ_HEADER]: "llms-full" }
166
+ })
162
167
  );
163
168
  const type = response.headers.get("content-type") ?? "";
164
169
  if (!response.ok || !type.toLowerCase().startsWith("text/markdown")) {
@@ -172,6 +177,8 @@ function createFarmLlmsMarkdownReader(fetchMarkdown) {
172
177
  };
173
178
  }
174
179
  __name(createFarmLlmsMarkdownReader, "createFarmLlmsMarkdownReader");
180
+ var FARM_LLMS_FULL_PAGE_TIMEOUT_MS = 3e4;
181
+ var LLMS_PAGE_TIMED_OUT = /* @__PURE__ */ Symbol("farm.llms.pageTimedOut");
175
182
  async function renderFarmLlmsFullTxt(value, options) {
176
183
  const index = serializeFarmLlmsTxt(value);
177
184
  if (typeof value === "string") return index;
@@ -185,10 +192,25 @@ async function renderFarmLlmsFullTxt(value, options) {
185
192
  links.push(link);
186
193
  }
187
194
  }
195
+ const pageTimeout = options.pageTimeout ?? FARM_LLMS_FULL_PAGE_TIMEOUT_MS;
196
+ const readWithinTimeout = /* @__PURE__ */ __name(async (url) => {
197
+ let timer;
198
+ const timedOut = new Promise((resolve) => {
199
+ timer = setTimeout(resolve, pageTimeout, LLMS_PAGE_TIMED_OUT);
200
+ });
201
+ try {
202
+ const content = await Promise.race([options.readMarkdown(url), timedOut]);
203
+ if (content !== LLMS_PAGE_TIMED_OUT) return content;
204
+ options.onIncomplete?.();
205
+ return null;
206
+ } finally {
207
+ clearTimeout(timer);
208
+ }
209
+ }, "readWithinTimeout");
188
210
  const contents = await mapWithConcurrency(
189
211
  links,
190
212
  options.concurrency ?? 4,
191
- (link) => shouldInlineLlmsLink(link.url, options.origin) ? options.readMarkdown(link.url) : null
213
+ (link) => shouldInlineLlmsLink(link.url, options.origin) ? readWithinTimeout(link.url) : null
192
214
  );
193
215
  const blocks = [`# ${toSingleLine(llms.title)}`];
194
216
  if (llms.summary?.trim()) blocks.push(`> ${toSingleLine(llms.summary)}`);
@@ -211,27 +233,35 @@ function createFarmLlmsFullRenderer(options = {}) {
211
233
  const maxEntries = options.maxEntries ?? 16;
212
234
  const entries = /* @__PURE__ */ new Map();
213
235
  let queue = Promise.resolve();
214
- return (origin, render) => {
236
+ const settle = /* @__PURE__ */ __name((body, complete, onSettled) => onSettled ? body.then((value) => (onSettled(complete()), value)) : body, "settle");
237
+ return (origin, render, onSettled) => {
215
238
  const entry = entries.get(origin);
216
- if (entry && entry.expires > now()) return entry.body;
239
+ if (entry && entry.expires > now()) return settle(entry.body, entry.complete, onSettled);
217
240
  entries.delete(origin);
218
- const body = queue.then(render);
241
+ let complete = true;
242
+ const body = queue.then(
243
+ () => render({
244
+ incomplete: /* @__PURE__ */ __name(() => {
245
+ complete = false;
246
+ }, "incomplete")
247
+ })
248
+ );
219
249
  queue = body.catch(() => {
220
250
  });
221
- const pending = { body, expires: Number.POSITIVE_INFINITY };
251
+ const pending = { body, expires: Number.POSITIVE_INFINITY, complete: /* @__PURE__ */ __name(() => complete, "complete") };
222
252
  entries.set(origin, pending);
223
253
  if (entries.size > maxEntries) entries.delete(entries.keys().next().value);
224
254
  body.then(
225
255
  () => {
226
256
  if (entries.get(origin) !== pending) return;
227
- if (ttl > 0) pending.expires = now() + ttl;
257
+ if (ttl > 0 && complete) pending.expires = now() + ttl;
228
258
  else entries.delete(origin);
229
259
  },
230
260
  () => {
231
261
  if (entries.get(origin) === pending) entries.delete(origin);
232
262
  }
233
263
  );
234
- return body;
264
+ return settle(body, pending.complete, onSettled);
235
265
  };
236
266
  }
237
267
  __name(createFarmLlmsFullRenderer, "createFarmLlmsFullRenderer");
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunk2ITKVAIFcjs = require('./chunk-2ITKVAIF.cjs');
4
+ var _chunkQIH2HD6Hcjs = require('./chunk-QIH2HD6H.cjs');
5
5
 
6
6
 
7
7
  var _chunkS3JO3N4Hcjs = require('./chunk-S3JO3N4H.cjs');
@@ -116,7 +116,7 @@ async function createFarmMarkdownSourceResponse(options) {
116
116
  }
117
117
  const url = new URL(options.request.url);
118
118
  const hasMarkdownExtension = url.pathname.toLowerCase().endsWith(".md");
119
- if (!hasMarkdownExtension && !_chunk2ITKVAIFcjs.requestAcceptsMarkdown.call(void 0, options.request.headers.get("accept"))) {
119
+ if (!hasMarkdownExtension && !_chunkQIH2HD6Hcjs.requestAcceptsMarkdown.call(void 0, options.request.headers.get("accept"))) {
120
120
  return null;
121
121
  }
122
122
  const targetPathname = normalizeFarmMarkdownRoutePath(url.pathname);
@@ -134,7 +134,7 @@ async function createFarmMarkdownSourceResponse(options) {
134
134
  if (!hasMarkdownExtension) {
135
135
  headers.set("Vary", "Accept");
136
136
  }
137
- return _chunk2ITKVAIFcjs.createFarmMarkdownViewResponse.call(void 0, {
137
+ return _chunkQIH2HD6Hcjs.createFarmMarkdownViewResponse.call(void 0, {
138
138
  request: options.request,
139
139
  requestUrl: url,
140
140
  markdown: source.source,