veryfront 0.1.73 → 0.1.74
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/cli/commands/knowledge/command-help.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command-help.js +3 -1
- package/esm/cli/commands/knowledge/command.d.ts +32 -5
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +87 -21
- package/esm/cli/commands/knowledge/parser-source.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/parser-source.js +110 -5
- package/esm/deno.js +1 -1
- package/esm/src/server/handlers/request/ssr/ssr.handler.d.ts +2 -0
- package/esm/src/server/handlers/request/ssr/ssr.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/ssr/ssr.handler.js +6 -2
- package/esm/src/server/runtime-handler/adapter-factory.d.ts +3 -0
- package/esm/src/server/runtime-handler/adapter-factory.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/adapter-factory.js +6 -5
- package/esm/src/server/runtime-handler/index.d.ts +33 -0
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +103 -37
- package/esm/src/server/runtime-handler/local-project-discovery.d.ts +32 -4
- package/esm/src/server/runtime-handler/local-project-discovery.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/local-project-discovery.js +46 -16
- package/esm/src/server/services/rendering/ssr.service.d.ts +19 -1
- package/esm/src/server/services/rendering/ssr.service.d.ts.map +1 -1
- package/esm/src/server/services/rendering/ssr.service.js +9 -1
- package/esm/src/server/shared/renderer/adapter.d.ts +25 -0
- package/esm/src/server/shared/renderer/adapter.d.ts.map +1 -1
- package/esm/src/server/shared/renderer/adapter.js +83 -10
- package/esm/src/server/shared/renderer/index.d.ts +1 -1
- package/esm/src/server/shared/renderer/index.d.ts.map +1 -1
- package/esm/src/server/shared/renderer/index.js +1 -1
- package/package.json +1 -1
- package/src/cli/commands/knowledge/command-help.ts +3 -1
- package/src/cli/commands/knowledge/command.ts +104 -21
- package/src/cli/commands/knowledge/parser-source.ts +110 -5
- package/src/deno.js +1 -1
- package/src/src/server/handlers/request/ssr/ssr.handler.ts +11 -2
- package/src/src/server/runtime-handler/adapter-factory.ts +13 -5
- package/src/src/server/runtime-handler/index.ts +132 -39
- package/src/src/server/runtime-handler/local-project-discovery.ts +51 -17
- package/src/src/server/services/rendering/ssr.service.ts +34 -3
- package/src/src/server/shared/renderer/adapter.ts +107 -8
- package/src/src/server/shared/renderer/index.ts +7 -1
|
@@ -67,6 +67,108 @@ import { SCANNER_PATH_PATTERN } from "../../utils/constants/security.js";
|
|
|
67
67
|
export { parseProxyEnvironment } from "./proxy-environment.js";
|
|
68
68
|
const baseLogger = getBaseLogger("SERVER");
|
|
69
69
|
const logger = baseLogger.component("runtime-handler");
|
|
70
|
+
/** Handler names in registration order. */
|
|
71
|
+
export const HANDLER_NAMES = [
|
|
72
|
+
"AuthHandler",
|
|
73
|
+
"CsrfHandler",
|
|
74
|
+
"HMRHandler",
|
|
75
|
+
"CorsHandler",
|
|
76
|
+
"HealthHandler",
|
|
77
|
+
"MetricsHandler",
|
|
78
|
+
"MemoryDebugHandler",
|
|
79
|
+
"ClientLogHandler",
|
|
80
|
+
"DevEndpointsHandler",
|
|
81
|
+
"StylesCSSHandler",
|
|
82
|
+
"DebugContextHandler",
|
|
83
|
+
"OpenAPIHandler",
|
|
84
|
+
"OpenAPIDocsHandler",
|
|
85
|
+
"InternalAgentsListHandler",
|
|
86
|
+
"AgentStreamHandler",
|
|
87
|
+
"AgentRunResumeHandler",
|
|
88
|
+
"AgentRunCancelHandler",
|
|
89
|
+
"ChannelInvokeHandler",
|
|
90
|
+
"DevDashboardHandler",
|
|
91
|
+
"ProjectsHandler",
|
|
92
|
+
"StudioBridgeModulesHandler",
|
|
93
|
+
"CSSHandler",
|
|
94
|
+
"DevFileHandler",
|
|
95
|
+
"SnippetHandler",
|
|
96
|
+
"StaticHandler",
|
|
97
|
+
"LibModulesHandler",
|
|
98
|
+
"RSCHandler",
|
|
99
|
+
"ModuleHandler",
|
|
100
|
+
"ApiHandlerWrapper",
|
|
101
|
+
"MarkdownPreviewHandler",
|
|
102
|
+
"SSRHandler",
|
|
103
|
+
"NotFoundHandler",
|
|
104
|
+
];
|
|
105
|
+
/** Factory for each handler. Only called when no override is provided (lazy instantiation). */
|
|
106
|
+
const handlerFactories = {
|
|
107
|
+
AuthHandler: () => new AuthHandler(),
|
|
108
|
+
CsrfHandler: () => new CsrfHandler(),
|
|
109
|
+
HMRHandler: () => new HMRHandler(),
|
|
110
|
+
CorsHandler: () => new CorsHandler(),
|
|
111
|
+
HealthHandler: () => new HealthHandler(),
|
|
112
|
+
MetricsHandler: () => new MetricsHandler(),
|
|
113
|
+
MemoryDebugHandler: () => new MemoryDebugHandler(),
|
|
114
|
+
ClientLogHandler: () => new ClientLogHandler(),
|
|
115
|
+
DevEndpointsHandler: () => new DevEndpointsHandler(),
|
|
116
|
+
StylesCSSHandler: () => new StylesCSSHandler(),
|
|
117
|
+
DebugContextHandler: () => new DebugContextHandler(),
|
|
118
|
+
OpenAPIHandler: () => new OpenAPIHandler(),
|
|
119
|
+
OpenAPIDocsHandler: () => new OpenAPIDocsHandler(),
|
|
120
|
+
InternalAgentsListHandler: () => new InternalAgentsListHandler(),
|
|
121
|
+
AgentStreamHandler: () => new AgentStreamHandler(),
|
|
122
|
+
AgentRunResumeHandler: () => new AgentRunResumeHandler(),
|
|
123
|
+
AgentRunCancelHandler: () => new AgentRunCancelHandler(),
|
|
124
|
+
ChannelInvokeHandler: () => new ChannelInvokeHandler(),
|
|
125
|
+
DevDashboardHandler: () => new DevDashboardHandler(),
|
|
126
|
+
ProjectsHandler: () => new ProjectsHandler(),
|
|
127
|
+
StudioBridgeModulesHandler: () => new StudioBridgeModulesHandler(),
|
|
128
|
+
CSSHandler: () => new CSSHandler(),
|
|
129
|
+
DevFileHandler: () => new DevFileHandler(),
|
|
130
|
+
SnippetHandler: () => new SnippetHandler(),
|
|
131
|
+
StaticHandler: () => new StaticHandler(),
|
|
132
|
+
LibModulesHandler: () => new LibModulesHandler(),
|
|
133
|
+
RSCHandler: () => new RSCHandler(),
|
|
134
|
+
ModuleHandler: () => new ModuleHandler(),
|
|
135
|
+
ApiHandlerWrapper: (projectDir, adapter) => new ApiHandlerWrapper(projectDir, adapter),
|
|
136
|
+
MarkdownPreviewHandler: () => new MarkdownPreviewHandler(),
|
|
137
|
+
SSRHandler: () => new SSRHandler(),
|
|
138
|
+
NotFoundHandler: () => new NotFoundHandler(),
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Creates a RouteRegistry populated with the standard handler chain.
|
|
142
|
+
*
|
|
143
|
+
* Handlers are instantiated lazily — overridden slots skip construction
|
|
144
|
+
* of the default handler entirely.
|
|
145
|
+
*
|
|
146
|
+
* @param projectDir - Root project directory
|
|
147
|
+
* @param adapter - Runtime adapter for environment access
|
|
148
|
+
* @param deps - Optional dependency overrides for testing
|
|
149
|
+
* @returns Object containing the registry and the api handler (for initialization)
|
|
150
|
+
*/
|
|
151
|
+
export function createHandlerRegistry(projectDir, adapter, deps = {}) {
|
|
152
|
+
const registry = new RouteRegistry({
|
|
153
|
+
debug: deps.debug,
|
|
154
|
+
enableMetrics: true,
|
|
155
|
+
});
|
|
156
|
+
const overrides = deps.overrides ?? {};
|
|
157
|
+
// Create the ApiHandlerWrapper first — it's special because callers need
|
|
158
|
+
// the returned instance for initialization regardless of overrides.
|
|
159
|
+
const apiHandler = overrides.ApiHandlerWrapper
|
|
160
|
+
? overrides.ApiHandlerWrapper
|
|
161
|
+
: new ApiHandlerWrapper(projectDir, adapter);
|
|
162
|
+
const handlers = HANDLER_NAMES.map((name) => {
|
|
163
|
+
if (name === "ApiHandlerWrapper")
|
|
164
|
+
return apiHandler;
|
|
165
|
+
if (overrides[name])
|
|
166
|
+
return overrides[name];
|
|
167
|
+
return handlerFactories[name](projectDir, adapter);
|
|
168
|
+
});
|
|
169
|
+
registry.registerAll(handlers);
|
|
170
|
+
return { registry, apiHandler };
|
|
171
|
+
}
|
|
70
172
|
export function createVeryfrontHandler(projectDir, adapter, opts = { projectDir }) {
|
|
71
173
|
const isDebugEnabled = !!(opts.debug || adapter.env.get("VERYFRONT_DEBUG"));
|
|
72
174
|
function logDebug(message, extra) {
|
|
@@ -109,45 +211,9 @@ export function createVeryfrontHandler(projectDir, adapter, opts = { projectDir
|
|
|
109
211
|
return undefined;
|
|
110
212
|
}
|
|
111
213
|
})();
|
|
112
|
-
const registry =
|
|
214
|
+
const { registry, apiHandler } = createHandlerRegistry(projectDir, adapter, {
|
|
113
215
|
debug: opts.debug,
|
|
114
|
-
enableMetrics: true,
|
|
115
216
|
});
|
|
116
|
-
const apiHandler = new ApiHandlerWrapper(projectDir, adapter);
|
|
117
|
-
registry.registerAll([
|
|
118
|
-
new AuthHandler(),
|
|
119
|
-
new CsrfHandler(),
|
|
120
|
-
new HMRHandler(),
|
|
121
|
-
new CorsHandler(),
|
|
122
|
-
new HealthHandler(),
|
|
123
|
-
new MetricsHandler(),
|
|
124
|
-
new MemoryDebugHandler(),
|
|
125
|
-
new ClientLogHandler(),
|
|
126
|
-
new DevEndpointsHandler(),
|
|
127
|
-
new StylesCSSHandler(),
|
|
128
|
-
new DebugContextHandler(),
|
|
129
|
-
new OpenAPIHandler(),
|
|
130
|
-
new OpenAPIDocsHandler(),
|
|
131
|
-
new InternalAgentsListHandler(),
|
|
132
|
-
new AgentStreamHandler(),
|
|
133
|
-
new AgentRunResumeHandler(),
|
|
134
|
-
new AgentRunCancelHandler(),
|
|
135
|
-
new ChannelInvokeHandler(),
|
|
136
|
-
new DevDashboardHandler(),
|
|
137
|
-
new ProjectsHandler(),
|
|
138
|
-
new StudioBridgeModulesHandler(),
|
|
139
|
-
new CSSHandler(),
|
|
140
|
-
new DevFileHandler(),
|
|
141
|
-
new SnippetHandler(),
|
|
142
|
-
new StaticHandler(),
|
|
143
|
-
new LibModulesHandler(),
|
|
144
|
-
new RSCHandler(),
|
|
145
|
-
new ModuleHandler(),
|
|
146
|
-
apiHandler,
|
|
147
|
-
new MarkdownPreviewHandler(),
|
|
148
|
-
new SSRHandler(),
|
|
149
|
-
new NotFoundHandler(),
|
|
150
|
-
]);
|
|
151
217
|
const isProxyMode = opts.config?.fs?.veryfront?.proxyMode === true;
|
|
152
218
|
const readyPromise = isProxyMode ? Promise.resolve() : apiHandler.initialize().catch((error) => {
|
|
153
219
|
logger.error("API handler initialization failed", {
|
|
@@ -8,19 +8,47 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { RuntimeAdapter } from "../../platform/adapters/base.js";
|
|
10
10
|
import { LRUCache } from "../../utils/lru-wrapper.js";
|
|
11
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* Injectable cache container for project discovery state.
|
|
13
|
+
*
|
|
14
|
+
* Wraps both the project-path cache (slug → absolute path) and the
|
|
15
|
+
* adapter cache (project dir → RuntimeAdapter) so that callers — especially
|
|
16
|
+
* tests — can supply an isolated instance instead of sharing global state.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ProjectDiscoveryCache {
|
|
19
|
+
/** Cache of discovered local project paths by slug */
|
|
20
|
+
readonly projects: LRUCache<string, string>;
|
|
21
|
+
/** Cache of local adapters by project directory */
|
|
22
|
+
readonly adapters: LRUCache<string, RuntimeAdapter>;
|
|
23
|
+
constructor(opts?: {
|
|
24
|
+
maxProjects?: number;
|
|
25
|
+
maxAdapters?: number;
|
|
26
|
+
});
|
|
27
|
+
/** Clear both caches */
|
|
28
|
+
clear(): void;
|
|
29
|
+
}
|
|
30
|
+
/** Default module-level cache instance (backward-compatible singleton) */
|
|
31
|
+
export declare const defaultDiscoveryCache: ProjectDiscoveryCache;
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated Use `defaultDiscoveryCache.adapters` instead.
|
|
34
|
+
* Kept for backward compatibility with existing consumers.
|
|
35
|
+
*/
|
|
12
36
|
export declare const localAdapterCache: LRUCache<string, RuntimeAdapter>;
|
|
37
|
+
/**
|
|
38
|
+
* @deprecated Use `defaultDiscoveryCache.projects` instead.
|
|
39
|
+
* Kept for backward compatibility with existing consumers.
|
|
40
|
+
*/
|
|
41
|
+
export declare const localProjectCache: LRUCache<string, string>;
|
|
13
42
|
/** Standard directories to search for local projects */
|
|
14
43
|
export declare const standardProjectDirs: string[];
|
|
15
|
-
/** Cache of discovered local project paths by slug */
|
|
16
|
-
export declare const localProjectCache: LRUCache<string, string>;
|
|
17
44
|
/**
|
|
18
45
|
* Find the local filesystem path for a project by slug.
|
|
19
46
|
*
|
|
20
47
|
* @param slug - The project slug to find
|
|
21
48
|
* @param adapter - The runtime adapter to use for filesystem operations
|
|
22
49
|
* @param headerPath - Optional path from x-project-path header (takes precedence)
|
|
50
|
+
* @param cache - Optional cache instance (defaults to module-level singleton)
|
|
23
51
|
* @returns The absolute path to the project, or undefined if not found
|
|
24
52
|
*/
|
|
25
|
-
export declare function findLocalProjectPath(slug: string, adapter: RuntimeAdapter, headerPath?: string): Promise<string | undefined>;
|
|
53
|
+
export declare function findLocalProjectPath(slug: string, adapter: RuntimeAdapter, headerPath?: string, cache?: ProjectDiscoveryCache): Promise<string | undefined>;
|
|
26
54
|
//# sourceMappingURL=local-project-discovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-project-discovery.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/local-project-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAOtD,mDAAmD;
|
|
1
|
+
{"version":3,"file":"local-project-discovery.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/local-project-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAOtD;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,sDAAsD;IACtD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;gBAExC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IASjE,wBAAwB;IACxB,KAAK,IAAI,IAAI;CAId;AAED,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,uBAA8B,CAAC;AAMjE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,kCAAiC,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,0BAAiC,CAAC;AAEhE,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,UAAgC,CAAC;AAsCjE;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,GAAE,qBAA6C,GACnD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA+C7B"}
|
|
@@ -12,20 +12,49 @@ import { LRUCache } from "../../utils/lru-wrapper.js";
|
|
|
12
12
|
import { registerLRUCache } from "../../cache/index.js";
|
|
13
13
|
const baseLogger = getBaseLogger("SERVER");
|
|
14
14
|
const logger = baseLogger.component("runtime-handler");
|
|
15
|
-
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Injectable cache container for project discovery state.
|
|
17
|
+
*
|
|
18
|
+
* Wraps both the project-path cache (slug → absolute path) and the
|
|
19
|
+
* adapter cache (project dir → RuntimeAdapter) so that callers — especially
|
|
20
|
+
* tests — can supply an isolated instance instead of sharing global state.
|
|
21
|
+
*/
|
|
22
|
+
export class ProjectDiscoveryCache {
|
|
23
|
+
/** Cache of discovered local project paths by slug */
|
|
24
|
+
projects;
|
|
25
|
+
/** Cache of local adapters by project directory */
|
|
26
|
+
adapters;
|
|
27
|
+
constructor(opts) {
|
|
28
|
+
this.projects = new LRUCache({
|
|
29
|
+
maxEntries: opts?.maxProjects ?? 100,
|
|
30
|
+
});
|
|
31
|
+
this.adapters = new LRUCache({
|
|
32
|
+
maxEntries: opts?.maxAdapters ?? 50,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Clear both caches */
|
|
36
|
+
clear() {
|
|
37
|
+
this.projects.clear();
|
|
38
|
+
this.adapters.clear();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Default module-level cache instance (backward-compatible singleton) */
|
|
42
|
+
export const defaultDiscoveryCache = new ProjectDiscoveryCache();
|
|
43
|
+
// Register the default caches for monitoring
|
|
44
|
+
registerLRUCache("local-project-cache", defaultDiscoveryCache.projects);
|
|
45
|
+
registerLRUCache("local-adapter-cache", defaultDiscoveryCache.adapters);
|
|
46
|
+
/**
|
|
47
|
+
* @deprecated Use `defaultDiscoveryCache.adapters` instead.
|
|
48
|
+
* Kept for backward compatibility with existing consumers.
|
|
49
|
+
*/
|
|
50
|
+
export const localAdapterCache = defaultDiscoveryCache.adapters;
|
|
51
|
+
/**
|
|
52
|
+
* @deprecated Use `defaultDiscoveryCache.projects` instead.
|
|
53
|
+
* Kept for backward compatibility with existing consumers.
|
|
54
|
+
*/
|
|
55
|
+
export const localProjectCache = defaultDiscoveryCache.projects;
|
|
21
56
|
/** Standard directories to search for local projects */
|
|
22
57
|
export const standardProjectDirs = ["data/projects", "projects"];
|
|
23
|
-
/** Cache of discovered local project paths by slug */
|
|
24
|
-
export const localProjectCache = new LRUCache({
|
|
25
|
-
maxEntries: 100,
|
|
26
|
-
});
|
|
27
|
-
// Register cache for monitoring
|
|
28
|
-
registerLRUCache("local-project-cache", localProjectCache);
|
|
29
58
|
function isNotFoundError(error) {
|
|
30
59
|
if (!(error instanceof Error))
|
|
31
60
|
return false;
|
|
@@ -68,9 +97,10 @@ async function isValidLocalProjectPath(path, adapter) {
|
|
|
68
97
|
* @param slug - The project slug to find
|
|
69
98
|
* @param adapter - The runtime adapter to use for filesystem operations
|
|
70
99
|
* @param headerPath - Optional path from x-project-path header (takes precedence)
|
|
100
|
+
* @param cache - Optional cache instance (defaults to module-level singleton)
|
|
71
101
|
* @returns The absolute path to the project, or undefined if not found
|
|
72
102
|
*/
|
|
73
|
-
export async function findLocalProjectPath(slug, adapter, headerPath) {
|
|
103
|
+
export async function findLocalProjectPath(slug, adapter, headerPath, cache = defaultDiscoveryCache) {
|
|
74
104
|
if (headerPath) {
|
|
75
105
|
try {
|
|
76
106
|
const normalizedPath = headerPath.trim();
|
|
@@ -78,7 +108,7 @@ export async function findLocalProjectPath(slug, adapter, headerPath) {
|
|
|
78
108
|
const absolutePath = normalizedPath.startsWith("/")
|
|
79
109
|
? normalizedPath
|
|
80
110
|
: `${cwd()}/${normalizedPath}`;
|
|
81
|
-
|
|
111
|
+
cache.projects.set(slug, absolutePath);
|
|
82
112
|
return absolutePath;
|
|
83
113
|
}
|
|
84
114
|
logger.warn("Ignoring invalid x-project-path override", {
|
|
@@ -94,7 +124,7 @@ export async function findLocalProjectPath(slug, adapter, headerPath) {
|
|
|
94
124
|
});
|
|
95
125
|
}
|
|
96
126
|
}
|
|
97
|
-
const cached =
|
|
127
|
+
const cached = cache.projects.get(slug);
|
|
98
128
|
if (cached)
|
|
99
129
|
return cached;
|
|
100
130
|
for (const dir of standardProjectDirs) {
|
|
@@ -103,7 +133,7 @@ export async function findLocalProjectPath(slug, adapter, headerPath) {
|
|
|
103
133
|
if (!await isValidLocalProjectPath(projectPath, adapter))
|
|
104
134
|
continue;
|
|
105
135
|
const absolutePath = projectPath.startsWith("/") ? projectPath : `${cwd()}/${projectPath}`;
|
|
106
|
-
|
|
136
|
+
cache.projects.set(slug, absolutePath);
|
|
107
137
|
logger.debug("Discovered local project", { slug, path: absolutePath });
|
|
108
138
|
return absolutePath;
|
|
109
139
|
}
|
|
@@ -2,6 +2,22 @@ import * as dntShim from "../../../../_dnt.shims.js";
|
|
|
2
2
|
import type { HandlerContext } from "../../handlers/types.js";
|
|
3
3
|
import { type RendererAdapter } from "../../shared/renderer-factory.js";
|
|
4
4
|
import type { CacheRepository } from "../../../repositories/types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Provides a renderer for a given handler context.
|
|
7
|
+
* Extracted to allow dependency injection in tests.
|
|
8
|
+
*/
|
|
9
|
+
export interface RendererProvider {
|
|
10
|
+
getRenderer(ctx: HandlerContext): Promise<RendererAdapter>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Minimal interface for SSRService consumers (e.g., SSRHandler).
|
|
14
|
+
* Allows dependency injection and mocking in tests.
|
|
15
|
+
*/
|
|
16
|
+
export interface SSRServiceLike {
|
|
17
|
+
checkMemoryPressure(): MemoryStatus;
|
|
18
|
+
renderPage(ctx: HandlerContext, options: SSRRenderOptions): Promise<SSRRenderResult>;
|
|
19
|
+
createMemoryPressureResult(slug: string): SSRRenderResult;
|
|
20
|
+
}
|
|
5
21
|
export interface SSRRenderResult {
|
|
6
22
|
status: number;
|
|
7
23
|
html?: string;
|
|
@@ -31,10 +47,12 @@ export interface MemoryStatus {
|
|
|
31
47
|
heapLimitMB: number;
|
|
32
48
|
heapUsedPercent: number;
|
|
33
49
|
}
|
|
34
|
-
export declare class SSRService {
|
|
50
|
+
export declare class SSRService implements SSRServiceLike {
|
|
35
51
|
private readonly cacheRepo?;
|
|
52
|
+
private readonly rendererProvider;
|
|
36
53
|
constructor(options?: {
|
|
37
54
|
cacheRepo?: CacheRepository<string>;
|
|
55
|
+
rendererProvider?: RendererProvider;
|
|
38
56
|
});
|
|
39
57
|
checkMemoryPressure(): MemoryStatus;
|
|
40
58
|
getRenderer(ctx: HandlerContext): Promise<RendererAdapter>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr.service.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/services/rendering/ssr.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,kCAAkC,CAAC;AAmB1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;IACpE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,
|
|
1
|
+
{"version":3,"file":"ssr.service.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/services/rendering/ssr.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,kCAAkC,CAAC;AAmB1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,mBAAmB,IAAI,YAAY,CAAC;IACpC,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrF,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;CAC3D;AAUD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;IACpE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;IACzB,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,UAAW,YAAW,cAAc;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA0B;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;gBAExC,OAAO,CAAC,EAAE;QACpB,SAAS,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;QACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;KACrC;IAKD,mBAAmB,IAAI,YAAY;IAW7B,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAI1D,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAiG1F,OAAO,CAAC,iBAAiB;IA4FzB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;CAS1D"}
|
|
@@ -10,10 +10,18 @@ import { ErrorOverlay, parseErrorLocation } from "../../dev-server/error-overlay
|
|
|
10
10
|
import { ErrorPages } from "../../utils/error-html.js";
|
|
11
11
|
import { HTTP_INTERNAL_SERVER_ERROR, HTTP_NOT_FOUND, HTTP_OK, HTTP_UNAVAILABLE, } from "../../../utils/constants/index.js";
|
|
12
12
|
const logger = serverLogger.component("ssr-service");
|
|
13
|
+
/**
|
|
14
|
+
* Default RendererProvider that delegates to the real getRendererForProject.
|
|
15
|
+
*/
|
|
16
|
+
const defaultRendererProvider = {
|
|
17
|
+
getRenderer: (ctx) => timeAsync("renderer-init", () => getRendererForProject(ctx)),
|
|
18
|
+
};
|
|
13
19
|
export class SSRService {
|
|
14
20
|
cacheRepo;
|
|
21
|
+
rendererProvider;
|
|
15
22
|
constructor(options) {
|
|
16
23
|
this.cacheRepo = options?.cacheRepo;
|
|
24
|
+
this.rendererProvider = options?.rendererProvider ?? defaultRendererProvider;
|
|
17
25
|
}
|
|
18
26
|
checkMemoryPressure() {
|
|
19
27
|
const stats = getHeapStats();
|
|
@@ -25,7 +33,7 @@ export class SSRService {
|
|
|
25
33
|
};
|
|
26
34
|
}
|
|
27
35
|
async getRenderer(ctx) {
|
|
28
|
-
return
|
|
36
|
+
return this.rendererProvider.getRenderer(ctx);
|
|
29
37
|
}
|
|
30
38
|
async renderPage(ctx, options) {
|
|
31
39
|
const { request, url, slug, nonce, studioEmbed, projectId, pageId, noHmr, useNoCache } = options;
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
**************************/
|
|
10
10
|
import * as dntShim from "../../../../_dnt.shims.js";
|
|
11
11
|
import type { HandlerContext } from "../../handlers/types.js";
|
|
12
|
+
import { type Renderer, type RendererOptions } from "../../../rendering/renderer.js";
|
|
12
13
|
import type { PageDataResponse, RenderOptions, RenderResult } from "../../../rendering/orchestrator/types.js";
|
|
13
14
|
import type { MdxBundle } from "../../../types/index.js";
|
|
14
15
|
export interface RendererAdapter {
|
|
@@ -28,6 +29,30 @@ export interface RendererAdapter {
|
|
|
28
29
|
compileMDX(content: string, frontmatter?: Record<string, unknown>, filePath?: string): Promise<MdxBundle>;
|
|
29
30
|
destroy(): Promise<void>;
|
|
30
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Abstraction over renderer initialization, allowing tests to inject
|
|
34
|
+
* a mock renderer without pulling in the full rendering subsystem.
|
|
35
|
+
*/
|
|
36
|
+
export interface RendererInitializer {
|
|
37
|
+
initialize(options: RendererOptions): Promise<Renderer>;
|
|
38
|
+
isInitialized(): boolean;
|
|
39
|
+
get(): Renderer;
|
|
40
|
+
destroy(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Replace the renderer initializer used by the adapter layer.
|
|
44
|
+
* Pass `undefined` to restore the default (real) initializer.
|
|
45
|
+
*
|
|
46
|
+
* Returns a disposer that restores the previous initializer — use in
|
|
47
|
+
* `afterEach` or with `using` to prevent test pollution:
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* afterEach(() => setRendererInitializer(undefined));
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @internal Test-only — not part of the public API.
|
|
54
|
+
*/
|
|
55
|
+
export declare function setRendererInitializer(initializer?: RendererInitializer): void;
|
|
31
56
|
export declare function getRendererForProject(ctx: HandlerContext): Promise<RendererAdapter>;
|
|
32
57
|
export declare function destroyRendererAdapter(): Promise<void>;
|
|
33
58
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/shared/renderer/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;4BAQ4B;AAC5B,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAMrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/shared/renderer/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;4BAQ4B;AAC5B,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAMrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAOL,KAAK,QAAQ,EACb,KAAK,eAAe,EACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,YAAY,EACb,MAAM,0CAA0C,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAYzD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACzE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClF,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,IAAI,IAAI,CAAC;IACtB,sBAAsB,IAAI;QACxB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1E,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAChF,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/B,KAAK,IAAI,IAAI,CAAC;KACf,CAAC;IACF,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,UAAU,CACR,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,CAAC;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,aAAa,IAAI,OAAO,CAAC;IACzB,GAAG,IAAI,QAAQ,CAAC;IAChB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AA0CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,CAAC,EAAE,mBAAmB,GAChC,IAAI,CAgBN;AAyND,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAiCzF;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAW5D"}
|
|
@@ -10,12 +10,72 @@ const logger = rendererLogger.component("renderer-adapter");
|
|
|
10
10
|
const RENDER_CACHE_TTL_SECONDS = 3_600;
|
|
11
11
|
/** Maximum entries for the local render cache layer */
|
|
12
12
|
const RENDER_CACHE_LOCAL_MAX_ENTRIES = 200;
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Default initializer that delegates to the real shared renderer
|
|
15
|
+
* singleton from `#veryfront/rendering/renderer.ts`.
|
|
16
|
+
*/
|
|
17
|
+
const defaultInitializer = {
|
|
18
|
+
initialize: initializeRenderer,
|
|
19
|
+
isInitialized: isRendererInitialized,
|
|
20
|
+
get: getRenderer,
|
|
21
|
+
destroy: destroySharedRenderer,
|
|
22
|
+
};
|
|
23
|
+
let activeInitializer = defaultInitializer;
|
|
24
|
+
let rendererInitState = null;
|
|
25
|
+
function scheduleInitializerDestroy(initializer, pendingPromise) {
|
|
26
|
+
const destroy = async () => {
|
|
27
|
+
try {
|
|
28
|
+
await initializer.destroy();
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
logger.warn("Failed to destroy renderer initializer", {
|
|
32
|
+
error: error instanceof Error ? error.message : String(error),
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
if (pendingPromise) {
|
|
37
|
+
void pendingPromise
|
|
38
|
+
.catch(() => undefined)
|
|
39
|
+
.then(destroy);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!initializer.isInitialized())
|
|
43
|
+
return;
|
|
44
|
+
void destroy();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Replace the renderer initializer used by the adapter layer.
|
|
48
|
+
* Pass `undefined` to restore the default (real) initializer.
|
|
49
|
+
*
|
|
50
|
+
* Returns a disposer that restores the previous initializer — use in
|
|
51
|
+
* `afterEach` or with `using` to prevent test pollution:
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* afterEach(() => setRendererInitializer(undefined));
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @internal Test-only — not part of the public API.
|
|
58
|
+
*/
|
|
59
|
+
export function setRendererInitializer(initializer) {
|
|
60
|
+
const nextInitializer = initializer ?? defaultInitializer;
|
|
61
|
+
const previous = activeInitializer;
|
|
62
|
+
const previousPendingPromise = rendererInitState?.initializer === previous
|
|
63
|
+
? rendererInitState.promise
|
|
64
|
+
: undefined;
|
|
65
|
+
activeInitializer = nextInitializer;
|
|
66
|
+
if (rendererInitState?.initializer !== activeInitializer) {
|
|
67
|
+
rendererInitState = null;
|
|
68
|
+
}
|
|
69
|
+
if (previous !== activeInitializer) {
|
|
70
|
+
scheduleInitializerDestroy(previous, previousPendingPromise);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
14
73
|
async function getOrInitRenderer() {
|
|
15
|
-
if (
|
|
16
|
-
return
|
|
17
|
-
if (
|
|
18
|
-
return
|
|
74
|
+
if (activeInitializer.isInitialized())
|
|
75
|
+
return activeInitializer.get();
|
|
76
|
+
if (rendererInitState?.initializer === activeInitializer) {
|
|
77
|
+
return rendererInitState.promise;
|
|
78
|
+
}
|
|
19
79
|
const isProxyMode = getEnvBoolean("PROXY_MODE", false, {
|
|
20
80
|
trueValues: ["1"],
|
|
21
81
|
trim: false,
|
|
@@ -42,12 +102,19 @@ async function getOrInitRenderer() {
|
|
|
42
102
|
hasApiUrl: !!apiBaseUrl,
|
|
43
103
|
cacheType: useApiCache ? "api-distributed" : "memory",
|
|
44
104
|
});
|
|
45
|
-
|
|
105
|
+
const initializer = activeInitializer;
|
|
106
|
+
const initPromise = initializer.initialize(options);
|
|
107
|
+
rendererInitState = {
|
|
108
|
+
initializer,
|
|
109
|
+
promise: initPromise,
|
|
110
|
+
};
|
|
46
111
|
try {
|
|
47
|
-
return await
|
|
112
|
+
return await initPromise;
|
|
48
113
|
}
|
|
49
114
|
finally {
|
|
50
|
-
|
|
115
|
+
if (rendererInitState?.promise === initPromise) {
|
|
116
|
+
rendererInitState = null;
|
|
117
|
+
}
|
|
51
118
|
}
|
|
52
119
|
}
|
|
53
120
|
function resolveEnvironment(ctx) {
|
|
@@ -210,6 +277,12 @@ export async function getRendererForProject(ctx) {
|
|
|
210
277
|
return new RendererAdapterImpl(renderer, renderCtx);
|
|
211
278
|
}
|
|
212
279
|
export async function destroyRendererAdapter() {
|
|
213
|
-
|
|
214
|
-
|
|
280
|
+
const pendingPromise = rendererInitState?.initializer === activeInitializer
|
|
281
|
+
? rendererInitState.promise
|
|
282
|
+
: undefined;
|
|
283
|
+
rendererInitState = null;
|
|
284
|
+
if (pendingPromise) {
|
|
285
|
+
await pendingPromise.catch(() => undefined);
|
|
286
|
+
}
|
|
287
|
+
await activeInitializer.destroy();
|
|
215
288
|
}
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module server/shared/renderer
|
|
5
5
|
*/
|
|
6
|
-
export { destroyRendererAdapter, getRendererForProject, type RendererAdapter } from "./adapter.js";
|
|
6
|
+
export { destroyRendererAdapter, getRendererForProject, type RendererAdapter, type RendererInitializer, setRendererInitializer, } from "./adapter.js";
|
|
7
7
|
export { shouldRejectDueToMemory } from "./memory/pressure.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/shared/renderer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/shared/renderer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module server/shared/renderer
|
|
5
5
|
*/
|
|
6
|
-
export { destroyRendererAdapter, getRendererForProject } from "./adapter.js";
|
|
6
|
+
export { destroyRendererAdapter, getRendererForProject, setRendererInitializer, } from "./adapter.js";
|
|
7
7
|
export { shouldRejectDueToMemory } from "./memory/pressure.js";
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@ import type { CommandHelp } from "../../help/types.js";
|
|
|
3
3
|
export const knowledgeHelp: CommandHelp = {
|
|
4
4
|
name: "knowledge",
|
|
5
5
|
description: "Ingest documents into the project knowledge base",
|
|
6
|
-
usage: "veryfront knowledge ingest <source
|
|
6
|
+
usage: "veryfront knowledge ingest <source...> [options]",
|
|
7
7
|
options: [
|
|
8
8
|
{
|
|
9
9
|
flag: "--project, -p <slug>",
|
|
@@ -28,6 +28,7 @@ export const knowledgeHelp: CommandHelp = {
|
|
|
28
28
|
],
|
|
29
29
|
examples: [
|
|
30
30
|
"veryfront knowledge ingest uploads/contracts/q1.pdf --json",
|
|
31
|
+
"veryfront knowledge ingest uploads/contracts/a.pdf uploads/contracts/b.pdf uploads/contracts/c.pdf --json",
|
|
31
32
|
"veryfront knowledge ingest /workspace/uploads/q1.pdf --json",
|
|
32
33
|
"veryfront knowledge ingest --path uploads/ --all --json",
|
|
33
34
|
],
|
|
@@ -36,5 +37,6 @@ export const knowledgeHelp: CommandHelp = {
|
|
|
36
37
|
"`uploads/...` means a remote project upload; use `./uploads/...` or `/workspace/uploads/...` to force a local file",
|
|
37
38
|
"`ingest` orchestrates upload resolution, parsing, and project file writes",
|
|
38
39
|
"Requires python3; non-text formats also require the supported parser packages unless you run inside the Veryfront sandbox",
|
|
40
|
+
"The Veryfront sandbox image includes `kreuzberg`, and knowledge ingest falls back to the built-in parser when `kreuzberg` is unavailable or extraction fails",
|
|
39
41
|
],
|
|
40
42
|
};
|