veryfront 0.1.797 → 0.1.799
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.
- package/esm/deno.js +1 -1
- package/esm/src/agent/hosted/chat-preparation.d.ts +3 -0
- package/esm/src/agent/hosted/chat-preparation.d.ts.map +1 -1
- package/esm/src/agent/hosted/chat-preparation.js +4 -4
- package/esm/src/agent/hosted/project-remote-tool-source.d.ts.map +1 -1
- package/esm/src/agent/hosted/project-remote-tool-source.js +16 -1
- package/esm/src/html/html-shell-generator.d.ts.map +1 -1
- package/esm/src/html/html-shell-generator.js +10 -10
- package/esm/src/release-assets/manifest-cache.d.ts +12 -3
- package/esm/src/release-assets/manifest-cache.d.ts.map +1 -1
- package/esm/src/release-assets/manifest-cache.js +67 -31
- package/esm/src/rendering/orchestrator/html.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/html.js +2 -0
- package/esm/src/rendering/orchestrator/types.d.ts +3 -0
- package/esm/src/rendering/orchestrator/types.d.ts.map +1 -1
- package/esm/src/rendering/renderer.d.ts +6 -2
- package/esm/src/rendering/renderer.d.ts.map +1 -1
- package/esm/src/rendering/renderer.js +41 -15
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
package/esm/deno.js
CHANGED
|
@@ -51,6 +51,7 @@ export type HostedChatRuntimeCreationPreparationInput<TRuntimeAgentDefinition> =
|
|
|
51
51
|
thinking?: RuntimeAgentThinkingConfig;
|
|
52
52
|
maxSteps?: number;
|
|
53
53
|
allowedRemoteTools?: unknown;
|
|
54
|
+
providerTools?: unknown;
|
|
54
55
|
};
|
|
55
56
|
projectId: string | null;
|
|
56
57
|
authToken: string;
|
|
@@ -93,6 +94,7 @@ export type HostedChatExecutionPreparationInput<TRuntimeAgentDefinition extends
|
|
|
93
94
|
thinking?: RuntimeAgentThinkingConfig;
|
|
94
95
|
maxSteps?: number;
|
|
95
96
|
allowedRemoteTools?: unknown;
|
|
97
|
+
providerTools?: unknown;
|
|
96
98
|
}, TRuntimeResult extends HostedChatRuntimeCreationResult> = {
|
|
97
99
|
request: ParsedHostedChatRequest;
|
|
98
100
|
agentConfig: TRuntimeAgentDefinition;
|
|
@@ -130,6 +132,7 @@ export declare function prepareHostedChatExecution<TRuntimeAgentDefinition exten
|
|
|
130
132
|
thinking?: RuntimeAgentThinkingConfig;
|
|
131
133
|
maxSteps?: number;
|
|
132
134
|
allowedRemoteTools?: unknown;
|
|
135
|
+
providerTools?: unknown;
|
|
133
136
|
}, TRuntimeResult extends HostedChatRuntimeCreationResult>(input: HostedChatExecutionPreparationInput<TRuntimeAgentDefinition, TRuntimeResult>): Promise<HostedChatExecutionPreparationResult<TRuntimeAgentDefinition, TRuntimeResult>>;
|
|
134
137
|
/** Prepare hosted chat runtime messages. */
|
|
135
138
|
export declare function prepareHostedChatRuntimeMessages(messages: readonly ChatUiMessage[], options?: PrepareHostedChatRuntimeMessagesOptions): Promise<AgentRuntimeMessage[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-preparation.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-preparation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EACV,gCAAgC,EAChC,+BAA+B,EAEhC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EACL,KAAK,gCAAgC,EAErC,KAAK,4CAA4C,EAClD,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAEL,KAAK,gDAAgD,EACtD,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AACjF,OAAO,EACL,KAAK,kCAAkC,EAExC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACpG,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAEjC,MAAM,6BAA6B,CAAC;AAGrC,kDAAkD;AAClD,MAAM,MAAM,2BAA2B,GAAG;IACxC,iBAAiB,EAAE,aAAa,EAAE,CAAC;IACnC,yBAAyB,EAAE,kBAAkB,CAAC;IAC9C,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,uCAAuC,GAC/C,IAAI,CACJ,gDAAgD,EAChD,yBAAyB,GAAG,wBAAwB,CACrD,GACC;IACA,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEJ,4DAA4D;AAC5D,MAAM,MAAM,0CAA0C,GAAG;IACvD,cAAc,CAAC,EAAE,gCAAgC,CAAC,gBAAgB,CAAC,CAAC;IACpE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5E,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,oCAAoC,GAAG;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC,CAAC;AAEF,0DAA0D;AAC1D,MAAM,MAAM,kCAAkC,CAAC,uBAAuB,IAAI;IACxE,WAAW,EAAE,uBAAuB,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC,CAAC;AAEF,kEAAkE;AAClE,MAAM,MAAM,yCAAyC,CAAC,uBAAuB,IAAI;IAC/E,OAAO,EAAE,uBAAuB,CAAC;IACjC,WAAW,EAAE,uBAAuB,GAAG;QACrC,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,0BAA0B,CAAC;QACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,kBAAkB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-preparation.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-preparation.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@ import { getRuntimeUploadUrl } from "../runtime/upload-url-client.js";
|
|
|
5
5
|
import { isRuntimeSkillVisibleTo } from "../runtime/skill-metadata.js";
|
|
6
6
|
import { applyContextBudget, ContextCompactionError, } from "./context-budget-manager.js";
|
|
7
7
|
import { findSubmittedFormInputResult } from "./form-input-tool.js";
|
|
8
|
-
function
|
|
9
|
-
return Array.isArray(agentConfig.
|
|
10
|
-
? agentConfig.
|
|
8
|
+
function getProviderToolNames(agentConfig) {
|
|
9
|
+
return Array.isArray(agentConfig.providerTools)
|
|
10
|
+
? agentConfig.providerTools.filter((toolName) => typeof toolName === "string" && toolName.length > 0)
|
|
11
11
|
: [];
|
|
12
12
|
}
|
|
13
13
|
async function flushRequiredContextCompactionEvent(rootRunContext, eventPayload) {
|
|
@@ -166,7 +166,7 @@ export async function prepareHostedChatExecution(input) {
|
|
|
166
166
|
authToken: input.request.authToken,
|
|
167
167
|
apiUrl: input.apiUrl,
|
|
168
168
|
projectId: input.request.projectId,
|
|
169
|
-
providerOwnedToolNames:
|
|
169
|
+
providerOwnedToolNames: getProviderToolNames(input.agentConfig),
|
|
170
170
|
});
|
|
171
171
|
let budgetedContext;
|
|
172
172
|
if (input.contextBudget) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-remote-tool-source.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/project-remote-tool-source.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project-remote-tool-source.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/project-remote-tool-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -92,6 +92,21 @@ export function createHostedProjectRemoteToolSource(input) {
|
|
|
92
92
|
},
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
|
+
function needsStudioMcpSource(input) {
|
|
96
|
+
const allowedToolNames = input.allowedToolNames;
|
|
97
|
+
if (!allowedToolNames) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
return Array.from(allowedToolNames).some((toolName) => toolName.startsWith("studio_"));
|
|
101
|
+
}
|
|
102
|
+
function resolveHostedProjectMcpServers(input) {
|
|
103
|
+
const servers = [...(input.mcpServers ?? defaultAgentServiceMcpServers())];
|
|
104
|
+
if (needsStudioMcpSource(input) &&
|
|
105
|
+
!servers.some((server) => server.kind === "veryfront-studio")) {
|
|
106
|
+
servers.push({ kind: "veryfront-studio" });
|
|
107
|
+
}
|
|
108
|
+
return servers;
|
|
109
|
+
}
|
|
95
110
|
function createHostedProjectRemoteToolSourceFromConfig(input, server, source, onProjectSwitch) {
|
|
96
111
|
const policySource = createHostedMcpToolPolicySource(source, server.toolPolicy);
|
|
97
112
|
return createHostedProjectRemoteToolSource({
|
|
@@ -153,7 +168,7 @@ function createHostedMcpToolPolicySource(source, policy) {
|
|
|
153
168
|
export function createHostedProjectRemoteToolSources(input) {
|
|
154
169
|
const createRemoteToolSource = input.createRemoteToolSource ?? createRemoteMCPToolSource;
|
|
155
170
|
const sources = [];
|
|
156
|
-
const mcpServers = input
|
|
171
|
+
const mcpServers = resolveHostedProjectMcpServers(input);
|
|
157
172
|
for (const server of mcpServers) {
|
|
158
173
|
const remoteConfig = createAgentServiceRemoteMcpConfig({
|
|
159
174
|
server,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-shell-generator.d.ts","sourceRoot":"","sources":["../../../src/src/html/html-shell-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2BxE,OAAO,EAGL,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAqCxD,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"html-shell-generator.d.ts","sourceRoot":"","sources":["../../../src/src/html/html-shell-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA2BxE,OAAO,EAGL,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAqCxD,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC;AAmFzE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,qBAAqB,EAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAC1C,KAAK,CAAC,EAAE,cAAc,EACtB,kBAAkB,CAAC,EAAE,MAAM,EAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAC5C,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBzC;AAmRD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,qBAAqB,EAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAC1C,KAAK,CAAC,EAAE,cAAc,EACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
|
|
@@ -5,7 +5,7 @@ import { profilePhase } from "../observability/request-profiler.js";
|
|
|
5
5
|
import { serverLogger } from "../utils/logger/logger.js";
|
|
6
6
|
import { isMarkdownPreview as checkMarkdownPreview } from "../transforms/md/utils.js";
|
|
7
7
|
import { generateModulePreloadHintsFromManifest, getRouteManifest, } from "../modules/manifest/route-module-manifest.js";
|
|
8
|
-
import {
|
|
8
|
+
import { getReadyManifestForRenderAsync } from "../release-assets/manifest-cache.js";
|
|
9
9
|
import { resolveManifestModuleUrl, resolveManifestRoutePreloadUrls, } from "../release-assets/html-consumption.js";
|
|
10
10
|
import { routeForPage } from "../release-assets/route-path.js";
|
|
11
11
|
import { buildNonceAttribute, escapeHTML } from "./html-escape.js";
|
|
@@ -41,15 +41,11 @@ function getRelativePagePath(fullPath, projectDir) {
|
|
|
41
41
|
function resolveProjectCSSScope(options, metaSlug) {
|
|
42
42
|
return options.projectSlug || options.projectId || metaSlug || "default";
|
|
43
43
|
}
|
|
44
|
-
function generateModulePreloadHints(options) {
|
|
44
|
+
function generateModulePreloadHints(options, releaseManifest) {
|
|
45
45
|
const hints = [];
|
|
46
46
|
const addedUrls = new Set();
|
|
47
47
|
const projectDir = options.projectDir ?? "";
|
|
48
48
|
const studioEmbed = options.studioEmbed;
|
|
49
|
-
// Release asset manifest (production only, env-gated, ready manifests only).
|
|
50
|
-
// Never consulted in studio-embed; returns null when the flag is off so the
|
|
51
|
-
// emitted HTML is byte-identical to today.
|
|
52
|
-
const releaseManifest = studioEmbed ? null : getReadyManifestForRender(options.releaseId);
|
|
53
49
|
function addHint(moduleUrl) {
|
|
54
50
|
if (!moduleUrl || addedUrls.has(moduleUrl))
|
|
55
51
|
return;
|
|
@@ -139,7 +135,12 @@ async function generateHTMLShellPartsImpl(meta, options, params, props, contentF
|
|
|
139
135
|
// Enable dev scripts for local dev OR preview mode (for HMR support in Studio),
|
|
140
136
|
// unless a caller explicitly forces production client scripts for fair benchmarking.
|
|
141
137
|
const useDevScripts = !options.forceProductionScripts && (isLocalProject || isPreviewMode);
|
|
142
|
-
const releaseManifest = options.studioEmbed
|
|
138
|
+
const releaseManifest = options.studioEmbed
|
|
139
|
+
? null
|
|
140
|
+
: "releaseAssetManifest" in options
|
|
141
|
+
? options
|
|
142
|
+
.releaseAssetManifest ?? null
|
|
143
|
+
: await profilePhase("html.release_asset_manifest", () => getReadyManifestForRenderAsync(options.releaseId));
|
|
143
144
|
const importMapPromise = buildImportMap({
|
|
144
145
|
projectDir: options.projectDir,
|
|
145
146
|
config: options.config,
|
|
@@ -156,7 +157,7 @@ async function generateHTMLShellPartsImpl(meta, options, params, props, contentF
|
|
|
156
157
|
})
|
|
157
158
|
: getProdScripts(meta.slug || "", params, props, nonce);
|
|
158
159
|
const modeStyles = useDevScripts ? getErrorOverlayStyles(nonce) : "";
|
|
159
|
-
const modulePreloadHints = generateModulePreloadHints(options);
|
|
160
|
+
const modulePreloadHints = generateModulePreloadHints(options, releaseManifest);
|
|
160
161
|
const importMap = await profilePhase("html.import_map", () => importMapPromise);
|
|
161
162
|
const importMapJson = importMap.json;
|
|
162
163
|
// Preload critical React dependencies to avoid waterfall delays.
|
|
@@ -213,8 +214,7 @@ async function generateHTMLShellPartsImpl(meta, options, params, props, contentF
|
|
|
213
214
|
// Manifest-consumed CSS: when a ready release asset manifest carries a
|
|
214
215
|
// compiled CSS entry, serve it from the immutable asset path (no renderer
|
|
215
216
|
// involvement). Per-entry fallback: no manifest CSS → existing JIT link.
|
|
216
|
-
const
|
|
217
|
-
const manifestCssEntry = useProductionCSS ? manifestForCss?.css?.[0] : undefined;
|
|
217
|
+
const manifestCssEntry = useProductionCSS ? releaseManifest?.css?.[0] : undefined;
|
|
218
218
|
if (manifestCssEntry) {
|
|
219
219
|
tailwindCSSBlock =
|
|
220
220
|
`<link rel="stylesheet" href="/_vf/assets/${manifestCssEntry.contentHash}.css">`;
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
* When the flag is off, `getReadyManifestForRender` always returns null so the
|
|
12
12
|
* HTML output is byte-identical to today.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Most callers use the non-blocking read so fallback stays cheap. HTML shell
|
|
15
|
+
* generation uses the awaited read so import maps, preload hints, CSS, and
|
|
16
|
+
* hydration data are generated from one manifest snapshot.
|
|
17
17
|
*
|
|
18
18
|
* Multi-tenancy: each releaseId is served by the fetcher registered for that
|
|
19
19
|
* specific releaseId (the adapter that owns it). There is no cross-project
|
|
@@ -65,6 +65,15 @@ export declare function isReleaseAssetManifestEnabled(): boolean;
|
|
|
65
65
|
* the flag is off or no fetcher is registered for this releaseId.
|
|
66
66
|
*/
|
|
67
67
|
export declare function getReadyManifestForRender(releaseId: string | null | undefined): ReleaseAssetManifest | null;
|
|
68
|
+
/**
|
|
69
|
+
* Await a ready manifest for `releaseId`.
|
|
70
|
+
*
|
|
71
|
+
* HTML generation uses this path so a cold process cannot emit a mixed shell
|
|
72
|
+
* where preload hints see the manifest but the import map does not. It still
|
|
73
|
+
* falls back to null when the flag is off, no fetcher is registered, the
|
|
74
|
+
* manifest is unavailable, or the fetch fails.
|
|
75
|
+
*/
|
|
76
|
+
export declare function getReadyManifestForRenderAsync(releaseId: string | null | undefined): Promise<ReleaseAssetManifest | null>;
|
|
68
77
|
/** Clear cached manifest bodies while keeping registered fetchers intact. */
|
|
69
78
|
export declare function clearCachedReleaseAssetManifests(): void;
|
|
70
79
|
/** Clear the cache and fetcher registry (tests / adapter teardown). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-cache.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/manifest-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest-cache.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/manifest-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAA6B,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAmC5F;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAC1B;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAChE,CAAC;CACH;AAKD;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,2BAA2B,GACnC,IAAI,CAEN;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAE3E;AAED;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,2BAA2B,GAAG,SAAS,GAC/C,IAAI,CAMN;AASD,yEAAyE;AACzE,wBAAgB,6BAA6B,IAAI,OAAO,CAKvD;AA6BD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,oBAAoB,GAAG,IAAI,CAoB7B;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACnC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAetC;AAqED,6EAA6E;AAC7E,wBAAgB,gCAAgC,IAAI,IAAI,CAIvD;AAED,uEAAuE;AACvE,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD"}
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
* When the flag is off, `getReadyManifestForRender` always returns null so the
|
|
12
12
|
* HTML output is byte-identical to today.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Most callers use the non-blocking read so fallback stays cheap. HTML shell
|
|
15
|
+
* generation uses the awaited read so import maps, preload hints, CSS, and
|
|
16
|
+
* hydration data are generated from one manifest snapshot.
|
|
17
17
|
*
|
|
18
18
|
* Multi-tenancy: each releaseId is served by the fetcher registered for that
|
|
19
19
|
* specific releaseId (the adapter that owns it). There is no cross-project
|
|
@@ -92,6 +92,27 @@ export function isReleaseAssetManifestEnabled() {
|
|
|
92
92
|
function cacheKey(releaseId, manifestVersion) {
|
|
93
93
|
return manifestVersion !== undefined ? `${releaseId}:${manifestVersion}` : releaseId;
|
|
94
94
|
}
|
|
95
|
+
function findCachedReadyEntry(releaseId) {
|
|
96
|
+
let best = null;
|
|
97
|
+
for (const [k, v] of manifestCache.entries()) {
|
|
98
|
+
if (k !== releaseId && !k.startsWith(`${releaseId}:`))
|
|
99
|
+
continue;
|
|
100
|
+
if (v.expiresAt > Date.now() && v.manifest) {
|
|
101
|
+
const existingVersion = best?.manifest?.manifestVersion ?? -1;
|
|
102
|
+
if ((v.manifest.manifestVersion ?? 0) > existingVersion) {
|
|
103
|
+
best = v;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return best;
|
|
108
|
+
}
|
|
109
|
+
function maybeScheduleReadyRefresh(releaseId, entry) {
|
|
110
|
+
const now = Date.now();
|
|
111
|
+
if ((entry.refreshAfter ?? entry.expiresAt) <= now) {
|
|
112
|
+
entry.refreshAfter = now + READY_REVALIDATE_MS;
|
|
113
|
+
scheduleFetch(releaseId);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
95
116
|
/**
|
|
96
117
|
* Return a ready manifest for `releaseId` if one is cached, else null.
|
|
97
118
|
*
|
|
@@ -106,27 +127,9 @@ export function getReadyManifestForRender(releaseId) {
|
|
|
106
127
|
return null;
|
|
107
128
|
if (!resolveFetcher(releaseId))
|
|
108
129
|
return null;
|
|
109
|
-
|
|
110
|
-
// of the LRU to find any `releaseId:*` entry; if we find a live ready one we
|
|
111
|
-
// return it without scheduling another fetch.
|
|
112
|
-
let best = null;
|
|
113
|
-
for (const [k, v] of manifestCache.entries()) {
|
|
114
|
-
if (k !== releaseId && !k.startsWith(`${releaseId}:`))
|
|
115
|
-
continue;
|
|
116
|
-
if (v.expiresAt > Date.now() && v.manifest) {
|
|
117
|
-
// Prefer the entry with the highest manifest version.
|
|
118
|
-
const existingVersion = best?.manifest?.manifestVersion ?? -1;
|
|
119
|
-
if ((v.manifest.manifestVersion ?? 0) > existingVersion) {
|
|
120
|
-
best = v;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
130
|
+
const best = findCachedReadyEntry(releaseId);
|
|
124
131
|
if (best) {
|
|
125
|
-
|
|
126
|
-
if ((best.refreshAfter ?? best.expiresAt) <= now) {
|
|
127
|
-
best.refreshAfter = now + READY_REVALIDATE_MS;
|
|
128
|
-
scheduleFetch(releaseId);
|
|
129
|
-
}
|
|
132
|
+
maybeScheduleReadyRefresh(releaseId, best);
|
|
130
133
|
return best.manifest;
|
|
131
134
|
}
|
|
132
135
|
// Also check the plain releaseId slot (non-ready / null entry).
|
|
@@ -138,23 +141,51 @@ export function getReadyManifestForRender(releaseId) {
|
|
|
138
141
|
scheduleFetch(releaseId);
|
|
139
142
|
return null;
|
|
140
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Await a ready manifest for `releaseId`.
|
|
146
|
+
*
|
|
147
|
+
* HTML generation uses this path so a cold process cannot emit a mixed shell
|
|
148
|
+
* where preload hints see the manifest but the import map does not. It still
|
|
149
|
+
* falls back to null when the flag is off, no fetcher is registered, the
|
|
150
|
+
* manifest is unavailable, or the fetch fails.
|
|
151
|
+
*/
|
|
152
|
+
export async function getReadyManifestForRenderAsync(releaseId) {
|
|
153
|
+
if (!releaseId)
|
|
154
|
+
return null;
|
|
155
|
+
if (!isReleaseAssetManifestEnabled())
|
|
156
|
+
return null;
|
|
157
|
+
if (!resolveFetcher(releaseId))
|
|
158
|
+
return null;
|
|
159
|
+
const best = findCachedReadyEntry(releaseId);
|
|
160
|
+
if (best) {
|
|
161
|
+
maybeScheduleReadyRefresh(releaseId, best);
|
|
162
|
+
return best.manifest;
|
|
163
|
+
}
|
|
164
|
+
const plain = manifestCache.get(releaseId);
|
|
165
|
+
if (plain && plain.expiresAt > Date.now())
|
|
166
|
+
return null;
|
|
167
|
+
return await fetchManifest(releaseId);
|
|
168
|
+
}
|
|
141
169
|
function scheduleFetch(releaseId) {
|
|
142
|
-
|
|
143
|
-
|
|
170
|
+
void fetchManifest(releaseId);
|
|
171
|
+
}
|
|
172
|
+
function fetchManifest(releaseId) {
|
|
173
|
+
const existing = inFlight.get(releaseId);
|
|
174
|
+
if (existing)
|
|
175
|
+
return existing.promise;
|
|
144
176
|
const active = resolveFetcher(releaseId);
|
|
145
177
|
if (!active)
|
|
146
|
-
return;
|
|
178
|
+
return Promise.resolve(null);
|
|
147
179
|
const fetchGeneration = cacheGeneration;
|
|
148
180
|
const token = Symbol(releaseId);
|
|
149
|
-
|
|
150
|
-
void Promise.resolve().then(async () => {
|
|
181
|
+
const promise = Promise.resolve().then(async () => {
|
|
151
182
|
try {
|
|
152
183
|
const result = await active(releaseId);
|
|
153
184
|
if (fetchGeneration !== cacheGeneration)
|
|
154
|
-
return;
|
|
185
|
+
return null;
|
|
155
186
|
if (!result) {
|
|
156
187
|
manifestCache.set(releaseId, { manifest: null, expiresAt: Date.now() + NON_READY_TTL_MS });
|
|
157
|
-
return;
|
|
188
|
+
return null;
|
|
158
189
|
}
|
|
159
190
|
const manifest = result.state === "ready" && result.manifest
|
|
160
191
|
? parseReleaseAssetManifest(result.manifest)
|
|
@@ -172,12 +203,14 @@ function scheduleFetch(releaseId) {
|
|
|
172
203
|
ttlMs: READY_TTL_MS,
|
|
173
204
|
refreshMs: READY_REVALIDATE_MS,
|
|
174
205
|
});
|
|
206
|
+
return manifest;
|
|
175
207
|
}
|
|
176
208
|
else {
|
|
177
209
|
manifestCache.set(releaseId, {
|
|
178
210
|
manifest: null,
|
|
179
211
|
expiresAt: Date.now() + NON_READY_TTL_MS,
|
|
180
212
|
});
|
|
213
|
+
return null;
|
|
181
214
|
}
|
|
182
215
|
}
|
|
183
216
|
catch (error) {
|
|
@@ -186,8 +219,9 @@ function scheduleFetch(releaseId) {
|
|
|
186
219
|
error: error instanceof Error ? error.message : String(error),
|
|
187
220
|
});
|
|
188
221
|
if (fetchGeneration !== cacheGeneration)
|
|
189
|
-
return;
|
|
222
|
+
return null;
|
|
190
223
|
manifestCache.set(releaseId, { manifest: null, expiresAt: Date.now() + NON_READY_TTL_MS });
|
|
224
|
+
return null;
|
|
191
225
|
}
|
|
192
226
|
finally {
|
|
193
227
|
const current = inFlight.get(releaseId);
|
|
@@ -196,6 +230,8 @@ function scheduleFetch(releaseId) {
|
|
|
196
230
|
}
|
|
197
231
|
}
|
|
198
232
|
});
|
|
233
|
+
inFlight.set(releaseId, { generation: fetchGeneration, token, promise });
|
|
234
|
+
return promise;
|
|
199
235
|
}
|
|
200
236
|
/** Clear cached manifest bodies while keeping registered fetchers intact. */
|
|
201
237
|
export function clearCachedReleaseAssetManifests() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AA4ElF,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BjE,kBAAkB,CACtB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC;YAqEZ,sBAAsB;
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AA4ElF,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BjE,kBAAkB,CACtB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC;YAqEZ,sBAAsB;YAsDtB,4BAA4B;YAiB5B,wBAAwB;YAmBxB,gBAAgB;YAyBhB,kBAAkB;IAwDhC,OAAO,CAAC,cAAc;YAQR,eAAe;YAaf,gBAAgB;IAkF9B;;;;OAIG;YACW,gBAAgB;CAc/B"}
|
|
@@ -142,6 +142,7 @@ export class HTMLGenerator {
|
|
|
142
142
|
buildImportMapJson({
|
|
143
143
|
projectDir: this.config.projectDir,
|
|
144
144
|
config: this.config.config,
|
|
145
|
+
releaseAssetManifest: context.options?.releaseAssetManifest,
|
|
145
146
|
}),
|
|
146
147
|
]);
|
|
147
148
|
const themedHtml = injectThemePersistenceScript(applyExplicitThemeToDocument(context.html, context.options?.colorScheme, context.options?.colorSchemeFromParam), context.options?.colorScheme, context.options?.colorSchemeFromParam, context.options?.nonce);
|
|
@@ -306,6 +307,7 @@ export class HTMLGenerator {
|
|
|
306
307
|
isLocalProject: this.config.mode === "development",
|
|
307
308
|
noHmr: context.options?.noHmr,
|
|
308
309
|
forceProductionScripts: context.options?.forceProductionScripts,
|
|
310
|
+
releaseAssetManifest: context.options?.releaseAssetManifest,
|
|
309
311
|
}));
|
|
310
312
|
}
|
|
311
313
|
/**
|
|
@@ -2,6 +2,7 @@ import type { RuntimeAdapter } from "../../platform/adapters/base.js";
|
|
|
2
2
|
import type { VeryfrontConfig } from "../../config/index.js";
|
|
3
3
|
import type { RenderResult } from "../../types/index.js";
|
|
4
4
|
import type { BuildVersion } from "../../utils/version.js";
|
|
5
|
+
import type { ReleaseAssetManifest } from "../../release-assets/manifest-schema.js";
|
|
5
6
|
export type { RenderResult };
|
|
6
7
|
export interface RendererOptions {
|
|
7
8
|
projectDir: string;
|
|
@@ -47,6 +48,8 @@ export interface RenderOptions {
|
|
|
47
48
|
contentSourceId?: string;
|
|
48
49
|
/** Release ID for production renders (drives release asset manifest consumption) */
|
|
49
50
|
releaseId?: string;
|
|
51
|
+
/** Request-scoped ready release asset manifest, shared by cache keys and HTML generation. */
|
|
52
|
+
releaseAssetManifest?: ReleaseAssetManifest | null;
|
|
50
53
|
/** Skip cache check in pipeline (cache already checked by Renderer) */
|
|
51
54
|
skipCacheCheck?: boolean;
|
|
52
55
|
/** Skip cache persistence (used for prefetch/aux renders like CSS generation) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAEpF,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qDAAqD;IACrD,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,oBAAoB,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnD,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IACrD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -26,7 +26,9 @@ export interface RendererOptions {
|
|
|
26
26
|
* be consumed once). This prevents "body already consumed" errors while
|
|
27
27
|
* still avoiding duplicate render work.
|
|
28
28
|
*
|
|
29
|
-
* The Singleflight key includes
|
|
29
|
+
* The Singleflight key includes cache prefix, slug, and colorScheme. The prefix
|
|
30
|
+
* includes release and manifest version when a ready release asset manifest is
|
|
31
|
+
* consumed, so JIT and manifest-backed renders never share in-flight work.
|
|
30
32
|
*/
|
|
31
33
|
export declare class Renderer {
|
|
32
34
|
private cache;
|
|
@@ -36,12 +38,14 @@ export declare class Renderer {
|
|
|
36
38
|
/**
|
|
37
39
|
* Singleflight for render deduplication. Caches HTML string results so
|
|
38
40
|
* concurrent requests for the same page share the render work.
|
|
39
|
-
* Key format: {
|
|
41
|
+
* Key format: {cachePrefix}:{slug}:{colorScheme}
|
|
40
42
|
*/
|
|
41
43
|
private renderFlight;
|
|
42
44
|
constructor(options?: RendererOptions);
|
|
43
45
|
initialize(options?: SharedServicesOptions): Promise<void>;
|
|
44
46
|
renderPage(slug: string, ctx: RenderContext, options?: RenderOptions): Promise<RenderResult>;
|
|
47
|
+
private resolveReleaseAssetManifest;
|
|
48
|
+
private withManifestCachePrefix;
|
|
45
49
|
/**
|
|
46
50
|
* Build a Singleflight key for render deduplication.
|
|
47
51
|
* Includes all context that affects rendering output.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/renderer.ts"],"names":[],"mappings":"AA6CA,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAgBzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAwBxD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AAeD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,qBAAqB,CAA8B;IAE3D;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAAwC;gBAEhD,OAAO,GAAE,eAAoB;IAInC,UAAU,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBhE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAwF9E,2BAA2B;IAWzC,OAAO,CAAC,uBAAuB;IAiB/B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;YAwBP,YAAY;IAoF1B,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,gBAAgB,CAAC;IAkB5B,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAU5C,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5D,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,wBAAwB;CA0FjC;AAED,OAAO,EACL,mBAAmB,EACnB,+BAA+B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,aAAa,GACnB,CAAC;AAMF,wBAAgB,WAAW,IAAI,QAAQ,CAOtC;AAED,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBrF;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAQrD;AAED,wBAAsB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYnF;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,aAAa,EACvB,cAAc,CAAC,EAAE,0BAA0B,GAC1C,OAAO,CAAC,YAAY,CAAC,CAIvB"}
|
|
@@ -34,8 +34,9 @@ import { rendererLogger } from "../utils/index.js";
|
|
|
34
34
|
import { MDXCacheAdapter } from "../transforms/mdx/index.js";
|
|
35
35
|
import { INITIALIZATION_ERROR, SERVICE_OVERLOADED } from "../errors/error-registry.js";
|
|
36
36
|
import { withSpan } from "../observability/tracing/otlp-setup.js";
|
|
37
|
-
import { buildQueryAwareCacheKey } from "../cache/keys.js";
|
|
37
|
+
import { buildQueryAwareCacheKey, buildRenderCachePrefix, } from "../cache/keys.js";
|
|
38
38
|
import { getEnvNumber } from "../platform/compat/process.js";
|
|
39
|
+
import { getReadyManifestForRenderAsync } from "../release-assets/manifest-cache.js";
|
|
39
40
|
import { createRenderContext, createRenderContextFromEnriched, } from "./context/render-context.js";
|
|
40
41
|
import { areSharedServicesInitialized, getSharedServices, initializeSharedServices, setSharedCompileMDX, } from "./shared/shared-services.js";
|
|
41
42
|
import { ContextAwareCacheCoordinator, } from "./shared/context-aware-cache.js";
|
|
@@ -72,7 +73,9 @@ const RENDER_PIPELINE_TIMEOUT_MS = getEnvNumber("RENDER_TIMEOUT_MS") ??
|
|
|
72
73
|
* be consumed once). This prevents "body already consumed" errors while
|
|
73
74
|
* still avoiding duplicate render work.
|
|
74
75
|
*
|
|
75
|
-
* The Singleflight key includes
|
|
76
|
+
* The Singleflight key includes cache prefix, slug, and colorScheme. The prefix
|
|
77
|
+
* includes release and manifest version when a ready release asset manifest is
|
|
78
|
+
* consumed, so JIT and manifest-backed renders never share in-flight work.
|
|
76
79
|
*/
|
|
77
80
|
export class Renderer {
|
|
78
81
|
cache;
|
|
@@ -82,7 +85,7 @@ export class Renderer {
|
|
|
82
85
|
/**
|
|
83
86
|
* Singleflight for render deduplication. Caches HTML string results so
|
|
84
87
|
* concurrent requests for the same page share the render work.
|
|
85
|
-
* Key format: {
|
|
88
|
+
* Key format: {cachePrefix}:{slug}:{colorScheme}
|
|
86
89
|
*/
|
|
87
90
|
renderFlight = new Singleflight();
|
|
88
91
|
constructor(options = {}) {
|
|
@@ -118,24 +121,30 @@ export class Renderer {
|
|
|
118
121
|
projectId: ctx.projectId,
|
|
119
122
|
environment: ctx.environment,
|
|
120
123
|
});
|
|
121
|
-
const
|
|
124
|
+
const releaseManifest = await this.resolveReleaseAssetManifest(ctx, options);
|
|
125
|
+
const effectiveCtx = this.withManifestCachePrefix(ctx, releaseManifest);
|
|
126
|
+
const effectiveOptions = {
|
|
127
|
+
...options,
|
|
128
|
+
releaseAssetManifest: releaseManifest,
|
|
129
|
+
};
|
|
130
|
+
const cacheKey = this.buildCacheKey(slug, effectiveCtx, effectiveOptions);
|
|
122
131
|
const cacheResult = cacheKey
|
|
123
|
-
? await this.cache.checkCache(slug,
|
|
132
|
+
? await this.cache.checkCache(slug, effectiveCtx, effectiveOptions?.colorScheme, cacheKey)
|
|
124
133
|
: { hit: false, cacheKey: "" };
|
|
125
134
|
if (cacheResult.hit && cacheResult.cachedResult) {
|
|
126
135
|
logger.debug("Cache hit", {
|
|
127
136
|
slug,
|
|
128
|
-
projectId:
|
|
129
|
-
colorScheme:
|
|
137
|
+
projectId: effectiveCtx.projectId,
|
|
138
|
+
colorScheme: effectiveOptions?.colorScheme,
|
|
130
139
|
duration: `${(performance.now() - startTime).toFixed(2)}ms`,
|
|
131
140
|
});
|
|
132
141
|
return cacheResult.cachedResult;
|
|
133
142
|
}
|
|
134
|
-
if (!(await acquireProjectSlot(
|
|
135
|
-
const activeCount = projectRenderCounts.get(
|
|
143
|
+
if (!(await acquireProjectSlot(effectiveCtx.projectId))) {
|
|
144
|
+
const activeCount = projectRenderCounts.get(effectiveCtx.projectId) ?? 0;
|
|
136
145
|
logger.error("Per-project render limit reached", {
|
|
137
146
|
slug,
|
|
138
|
-
projectId:
|
|
147
|
+
projectId: effectiveCtx.projectId,
|
|
139
148
|
activeRenders: activeCount,
|
|
140
149
|
limit: RENDER_PER_PROJECT_LIMIT,
|
|
141
150
|
});
|
|
@@ -151,10 +160,10 @@ export class Renderer {
|
|
|
151
160
|
}
|
|
152
161
|
const acquired = await renderSemaphore.tryAcquire(RENDER_ACQUIRE_TIMEOUT_MS);
|
|
153
162
|
if (!acquired) {
|
|
154
|
-
await releaseProjectSlot(
|
|
163
|
+
await releaseProjectSlot(effectiveCtx.projectId);
|
|
155
164
|
logger.error("Render capacity exceeded - service overloaded", {
|
|
156
165
|
slug,
|
|
157
|
-
projectId:
|
|
166
|
+
projectId: effectiveCtx.projectId,
|
|
158
167
|
waiting: renderSemaphore.waiting,
|
|
159
168
|
available: renderSemaphore.available,
|
|
160
169
|
});
|
|
@@ -164,11 +173,11 @@ export class Renderer {
|
|
|
164
173
|
});
|
|
165
174
|
}
|
|
166
175
|
try {
|
|
167
|
-
return await this.doRenderPage(slug,
|
|
176
|
+
return await this.doRenderPage(slug, effectiveCtx, effectiveOptions, startTime, cacheKey);
|
|
168
177
|
}
|
|
169
178
|
finally {
|
|
170
179
|
renderSemaphore.release();
|
|
171
|
-
await releaseProjectSlot(
|
|
180
|
+
await releaseProjectSlot(effectiveCtx.projectId);
|
|
172
181
|
}
|
|
173
182
|
}, {
|
|
174
183
|
"renderer.slug": slug,
|
|
@@ -176,12 +185,29 @@ export class Renderer {
|
|
|
176
185
|
"renderer.environment": ctx.environment,
|
|
177
186
|
});
|
|
178
187
|
}
|
|
188
|
+
async resolveReleaseAssetManifest(ctx, options) {
|
|
189
|
+
if (options && "releaseAssetManifest" in options) {
|
|
190
|
+
return options.releaseAssetManifest ?? null;
|
|
191
|
+
}
|
|
192
|
+
if (options?.studioEmbed || ctx.environment !== "production")
|
|
193
|
+
return null;
|
|
194
|
+
return await getReadyManifestForRenderAsync(ctx.releaseId);
|
|
195
|
+
}
|
|
196
|
+
withManifestCachePrefix(ctx, releaseManifest) {
|
|
197
|
+
if (!releaseManifest || ctx.environment !== "production")
|
|
198
|
+
return ctx;
|
|
199
|
+
const releaseKey = ctx.releaseId ?? ctx.contentSourceId.replace(/^release-/, "");
|
|
200
|
+
return {
|
|
201
|
+
...ctx,
|
|
202
|
+
cachePrefix: buildRenderCachePrefix(ctx.projectId, ctx.environment, releaseKey, releaseManifest.manifestVersion),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
179
205
|
/**
|
|
180
206
|
* Build a Singleflight key for render deduplication.
|
|
181
207
|
* Includes all context that affects rendering output.
|
|
182
208
|
*/
|
|
183
209
|
getSingleflightKey(slug, ctx, colorScheme) {
|
|
184
|
-
return `${ctx.
|
|
210
|
+
return `${ctx.cachePrefix}:${slug}:${colorScheme ?? "default"}`;
|
|
185
211
|
}
|
|
186
212
|
/**
|
|
187
213
|
* Compute a cache key that is query-aware and avoids caching personalized responses
|