veryfront 0.1.74 → 0.1.76
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/README.md +2 -0
- package/esm/cli/commands/files/command.d.ts +3 -3
- package/esm/cli/commands/knowledge/command.d.ts +2 -0
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +64 -1
- package/esm/deno.d.ts +7 -0
- package/esm/deno.js +13 -6
- package/esm/src/data/data-fetcher.d.ts +11 -1
- package/esm/src/data/data-fetcher.d.ts.map +1 -1
- package/esm/src/data/data-fetcher.js +5 -2
- package/esm/src/data/index.d.ts +1 -1
- package/esm/src/data/index.d.ts.map +1 -1
- package/esm/src/data/server-data-fetcher.d.ts +14 -1
- package/esm/src/data/server-data-fetcher.d.ts.map +1 -1
- package/esm/src/data/server-data-fetcher.js +65 -3
- package/esm/src/jobs/index.d.ts +34 -0
- package/esm/src/jobs/index.d.ts.map +1 -0
- package/esm/src/jobs/index.js +33 -0
- package/esm/src/jobs/jobs-client.d.ts +134 -0
- package/esm/src/jobs/jobs-client.d.ts.map +1 -0
- package/esm/src/jobs/jobs-client.js +218 -0
- package/esm/src/jobs/schemas.d.ts +1304 -0
- package/esm/src/jobs/schemas.d.ts.map +1 -0
- package/esm/src/jobs/schemas.js +159 -0
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts +4 -0
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts.map +1 -1
- package/esm/src/platform/adapters/veryfront-api-client/retry-handler.js +12 -6
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +21 -21
- package/esm/src/rendering/orchestrator/lifecycle.d.ts +4 -0
- package/esm/src/rendering/orchestrator/lifecycle.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/lifecycle.js +8 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +6 -1
- package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts +26 -1
- package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/ssr-orchestrator.js +77 -1
- package/esm/src/routing/api/handler.d.ts.map +1 -1
- package/esm/src/routing/api/handler.js +6 -2
- package/esm/src/routing/api/route-executor.d.ts +8 -2
- package/esm/src/routing/api/route-executor.d.ts.map +1 -1
- package/esm/src/routing/api/route-executor.js +158 -3
- package/esm/src/security/deno-permissions.d.ts +7 -1
- package/esm/src/security/deno-permissions.d.ts.map +1 -1
- package/esm/src/security/deno-permissions.js +12 -1
- package/esm/src/security/sandbox/project-worker.d.ts +61 -0
- package/esm/src/security/sandbox/project-worker.d.ts.map +1 -0
- package/esm/src/security/sandbox/project-worker.js +318 -0
- package/esm/src/security/sandbox/worker-permissions.d.ts +30 -0
- package/esm/src/security/sandbox/worker-permissions.d.ts.map +1 -0
- package/esm/src/security/sandbox/worker-permissions.js +63 -0
- package/esm/src/security/sandbox/worker-pool.d.ts +87 -0
- package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -0
- package/esm/src/security/sandbox/worker-pool.js +359 -0
- package/esm/src/security/sandbox/worker-types.d.ts +167 -0
- package/esm/src/security/sandbox/worker-types.d.ts.map +1 -0
- package/esm/src/security/sandbox/worker-types.js +19 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/internal-tasks-list.handler.js +72 -0
- package/esm/src/server/project-env/storage.d.ts +6 -0
- package/esm/src/server/project-env/storage.d.ts.map +1 -1
- package/esm/src/server/project-env/storage.js +8 -0
- package/esm/src/server/runtime-handler/index.d.ts +1 -1
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +3 -0
- package/esm/src/server/runtime-handler/project-isolation.d.ts +5 -0
- package/esm/src/server/runtime-handler/project-isolation.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/project-isolation.js +44 -0
- package/esm/src/server/shared/renderer/memory/pressure.d.ts +7 -0
- package/esm/src/server/shared/renderer/memory/pressure.d.ts.map +1 -1
- package/esm/src/server/shared/renderer/memory/pressure.js +7 -0
- package/esm/src/task/control-plane.d.ts +105 -0
- package/esm/src/task/control-plane.d.ts.map +1 -0
- package/esm/src/task/control-plane.js +52 -0
- package/esm/src/task/types.d.ts +6 -0
- package/esm/src/task/types.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.d.ts +4 -4
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.d.ts.map +1 -1
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.js +15 -15
- package/esm/src/utils/index.d.ts +10 -1
- package/esm/src/utils/index.d.ts.map +1 -1
- package/esm/src/utils/index.js +9 -1
- package/esm/src/utils/logger/index.d.ts +1 -1
- package/esm/src/utils/logger/index.d.ts.map +1 -1
- package/esm/src/utils/logger/index.js +1 -1
- package/esm/src/utils/logger/logger.d.ts +14 -0
- package/esm/src/utils/logger/logger.d.ts.map +1 -1
- package/esm/src/utils/logger/logger.js +17 -0
- package/esm/src/workflow/claude-code/tool.d.ts +5 -5
- package/package.json +8 -1
- package/src/cli/commands/knowledge/command.ts +76 -1
- package/src/deno.js +13 -6
- package/src/src/data/data-fetcher.ts +18 -2
- package/src/src/data/index.ts +1 -1
- package/src/src/data/server-data-fetcher.ts +106 -3
- package/src/src/jobs/index.ts +85 -0
- package/src/src/jobs/jobs-client.ts +503 -0
- package/src/src/jobs/schemas.ts +202 -0
- package/src/src/platform/adapters/veryfront-api-client/retry-handler.ts +15 -6
- package/src/src/proxy/handler.ts +27 -19
- package/src/src/rendering/orchestrator/lifecycle.ts +11 -0
- package/src/src/rendering/orchestrator/pipeline.ts +7 -2
- package/src/src/rendering/orchestrator/ssr-orchestrator.ts +119 -0
- package/src/src/routing/api/handler.ts +16 -3
- package/src/src/routing/api/route-executor.ts +258 -1
- package/src/src/security/deno-permissions.ts +13 -1
- package/src/src/security/sandbox/project-worker.ts +416 -0
- package/src/src/security/sandbox/worker-permissions.ts +77 -0
- package/src/src/security/sandbox/worker-pool.ts +459 -0
- package/src/src/security/sandbox/worker-types.ts +212 -0
- package/src/src/server/handlers/request/internal-tasks-list.handler.ts +103 -0
- package/src/src/server/project-env/storage.ts +9 -0
- package/src/src/server/runtime-handler/index.ts +3 -0
- package/src/src/server/runtime-handler/project-isolation.ts +53 -0
- package/src/src/server/shared/renderer/memory/pressure.ts +8 -0
- package/src/src/task/control-plane.ts +76 -0
- package/src/src/task/types.ts +6 -0
- package/src/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.ts +18 -12
- package/src/src/utils/index.ts +11 -0
- package/src/src/utils/logger/index.ts +1 -0
- package/src/src/utils/logger/logger.ts +34 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Isolation Types
|
|
3
|
+
*
|
|
4
|
+
* Shared type definitions for the worker isolation system.
|
|
5
|
+
* Used by both the main process and worker script.
|
|
6
|
+
*
|
|
7
|
+
* @module security/sandbox/worker-types
|
|
8
|
+
*/
|
|
9
|
+
/** Maximum request body size for worker isolation (10 MB) */
|
|
10
|
+
export const MAX_WORKER_BODY_BYTES = 10 * 1024 * 1024;
|
|
11
|
+
export const DEFAULT_WORKER_POOL_CONFIG = {
|
|
12
|
+
maxPoolSize: 20,
|
|
13
|
+
idleTimeoutMs: 300_000,
|
|
14
|
+
requestTimeoutMs: 30_000,
|
|
15
|
+
healthCheckIntervalMs: 30_000,
|
|
16
|
+
maxRequestsPerWorker: 1_000,
|
|
17
|
+
maxWorkerAgeMs: 600_000,
|
|
18
|
+
memoryBudgetMb: 64,
|
|
19
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import { type RuntimeTaskDiscoveryDeps } from "../../../task/control-plane.js";
|
|
3
|
+
import { BaseHandler } from "../response/base.js";
|
|
4
|
+
import type { HandlerContext, HandlerMetadata, HandlerResult } from "../types.js";
|
|
5
|
+
export declare class InternalTasksListHandler extends BaseHandler {
|
|
6
|
+
private readonly deps;
|
|
7
|
+
metadata: HandlerMetadata;
|
|
8
|
+
constructor(deps?: RuntimeTaskDiscoveryDeps);
|
|
9
|
+
handle(req: dntShim.Request, ctx: HandlerContext): Promise<HandlerResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=internal-tasks-list.handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-tasks-list.handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/server/handlers/request/internal-tasks-list.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAGrD,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,gCAAgC,CAAC;AAUxC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAEnG,qBAAa,wBAAyB,SAAQ,WAAW;IAQrD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,QAAQ,EAAE,eAAe,CAIvB;gBAGiB,IAAI,GAAE,wBAA0D;IAK7E,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAmEhF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { PRIORITY_MEDIUM_API } from "../../../utils/constants/index.js";
|
|
2
|
+
import { ZodError } from "zod";
|
|
3
|
+
import { ControlPlaneTasksListRequestSchema, defaultRuntimeTaskDiscoveryDeps, listRuntimeTasks, } from "../../../task/control-plane.js";
|
|
4
|
+
import { ControlPlaneRequestError, verifyControlPlaneRequest, } from "../../../internal-agents/control-plane-auth.js";
|
|
5
|
+
import { INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES, InternalAgentRequestBodyTooLargeError, readInternalAgentRequestBody, } from "../../../internal-agents/request-body.js";
|
|
6
|
+
import { BaseHandler } from "../response/base.js";
|
|
7
|
+
export class InternalTasksListHandler extends BaseHandler {
|
|
8
|
+
deps;
|
|
9
|
+
metadata = {
|
|
10
|
+
name: "InternalTasksListHandler",
|
|
11
|
+
priority: PRIORITY_MEDIUM_API,
|
|
12
|
+
patterns: [{ pattern: "/internal/tasks/list", exact: true, method: "POST" }],
|
|
13
|
+
};
|
|
14
|
+
constructor(deps = defaultRuntimeTaskDiscoveryDeps) {
|
|
15
|
+
super();
|
|
16
|
+
this.deps = deps;
|
|
17
|
+
}
|
|
18
|
+
async handle(req, ctx) {
|
|
19
|
+
if (!this.shouldHandle(req, ctx)) {
|
|
20
|
+
return this.continue();
|
|
21
|
+
}
|
|
22
|
+
return this.withProxyContext(ctx, async () => {
|
|
23
|
+
const builder = this.createResponseBuilder(ctx)
|
|
24
|
+
.withCORS(req, ctx.securityConfig?.cors)
|
|
25
|
+
.withSecurity(ctx.securityConfig ?? undefined, req);
|
|
26
|
+
try {
|
|
27
|
+
const rawBody = await readInternalAgentRequestBody(req, INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES);
|
|
28
|
+
const payload = ControlPlaneTasksListRequestSchema.parse(JSON.parse(rawBody));
|
|
29
|
+
const claims = await verifyControlPlaneRequest(req, ctx, rawBody, {
|
|
30
|
+
expectedSubject: payload.requestId,
|
|
31
|
+
expectedSurface: payload.surface,
|
|
32
|
+
});
|
|
33
|
+
if (payload.projectId !== claims.project_id ||
|
|
34
|
+
(ctx.projectId !== undefined && payload.projectId !== ctx.projectId)) {
|
|
35
|
+
this.logWarn("Internal tasks list request body did not match signed claims", {
|
|
36
|
+
projectSlug: ctx.projectSlug,
|
|
37
|
+
projectId: ctx.projectId,
|
|
38
|
+
requestId: payload.requestId,
|
|
39
|
+
signedRequestId: claims.sub,
|
|
40
|
+
surface: payload.surface,
|
|
41
|
+
signedSurface: claims.surface,
|
|
42
|
+
});
|
|
43
|
+
return this.respond(builder.json({ error: "Invalid control-plane signature" }, 401));
|
|
44
|
+
}
|
|
45
|
+
const response = await listRuntimeTasks(ctx, this.deps);
|
|
46
|
+
return this.respond(builder.json(response, 200));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof InternalAgentRequestBodyTooLargeError) {
|
|
50
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
51
|
+
}
|
|
52
|
+
if (error instanceof ControlPlaneRequestError) {
|
|
53
|
+
this.logWarn("Internal tasks list signature verification failed", {
|
|
54
|
+
error: error.message,
|
|
55
|
+
projectSlug: ctx.projectSlug,
|
|
56
|
+
projectId: ctx.projectId,
|
|
57
|
+
});
|
|
58
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
59
|
+
}
|
|
60
|
+
if (error instanceof SyntaxError || error instanceof ZodError) {
|
|
61
|
+
this.logWarn("Internal tasks list request validation failed", {
|
|
62
|
+
error: error instanceof Error ? error.message : String(error),
|
|
63
|
+
projectSlug: ctx.projectSlug,
|
|
64
|
+
projectId: ctx.projectId,
|
|
65
|
+
});
|
|
66
|
+
return this.respond(builder.json({ error: "Invalid internal tasks request" }, 400));
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -14,4 +14,10 @@ export declare function getProjectEnv(key: string): string | undefined;
|
|
|
14
14
|
* to prevent remote projects from reading host-level secrets.
|
|
15
15
|
*/
|
|
16
16
|
export declare function isProjectEnvActive(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Get a snapshot of the current project env overlay.
|
|
19
|
+
* Returns undefined if no overlay is active.
|
|
20
|
+
* Used to forward env vars to isolated workers in proxy mode.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getProjectEnvSnapshot(): Record<string, string> | undefined;
|
|
17
23
|
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/src/server/project-env/storage.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEjF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/src/server/project-env/storage.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEjF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAE1E"}
|
|
@@ -31,6 +31,14 @@ export function getProjectEnv(key) {
|
|
|
31
31
|
export function isProjectEnvActive() {
|
|
32
32
|
return projectEnvStorage.getStore() !== undefined;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Get a snapshot of the current project env overlay.
|
|
36
|
+
* Returns undefined if no overlay is active.
|
|
37
|
+
* Used to forward env vars to isolated workers in proxy mode.
|
|
38
|
+
*/
|
|
39
|
+
export function getProjectEnvSnapshot() {
|
|
40
|
+
return projectEnvStorage.getStore();
|
|
41
|
+
}
|
|
34
42
|
// Register on globalThis so process.ts can access without circular imports.
|
|
35
43
|
// process.ts is low-level (platform/compat), project-env is high-level (server/).
|
|
36
44
|
dntShim.dntGlobalThis.__vfProjectEnvGetter = getProjectEnv;
|
|
@@ -14,7 +14,7 @@ import type { Handler } from "../../types/index.js";
|
|
|
14
14
|
import { ApiHandlerWrapper } from "../handlers/request/api/index.js";
|
|
15
15
|
export { parseProxyEnvironment, type ProxyEnvironment } from "./proxy-environment.js";
|
|
16
16
|
/** Handler names in registration order. */
|
|
17
|
-
export declare const HANDLER_NAMES: readonly ["AuthHandler", "CsrfHandler", "HMRHandler", "CorsHandler", "HealthHandler", "MetricsHandler", "MemoryDebugHandler", "ClientLogHandler", "DevEndpointsHandler", "StylesCSSHandler", "DebugContextHandler", "OpenAPIHandler", "OpenAPIDocsHandler", "InternalAgentsListHandler", "AgentStreamHandler", "AgentRunResumeHandler", "AgentRunCancelHandler", "ChannelInvokeHandler", "DevDashboardHandler", "ProjectsHandler", "StudioBridgeModulesHandler", "CSSHandler", "DevFileHandler", "SnippetHandler", "StaticHandler", "LibModulesHandler", "RSCHandler", "ModuleHandler", "ApiHandlerWrapper", "MarkdownPreviewHandler", "SSRHandler", "NotFoundHandler"];
|
|
17
|
+
export declare const HANDLER_NAMES: readonly ["AuthHandler", "CsrfHandler", "HMRHandler", "CorsHandler", "HealthHandler", "MetricsHandler", "MemoryDebugHandler", "ClientLogHandler", "DevEndpointsHandler", "StylesCSSHandler", "DebugContextHandler", "OpenAPIHandler", "OpenAPIDocsHandler", "InternalAgentsListHandler", "InternalTasksListHandler", "AgentStreamHandler", "AgentRunResumeHandler", "AgentRunCancelHandler", "ChannelInvokeHandler", "DevDashboardHandler", "ProjectsHandler", "StudioBridgeModulesHandler", "CSSHandler", "DevFileHandler", "SnippetHandler", "StaticHandler", "LibModulesHandler", "RSCHandler", "ModuleHandler", "ApiHandlerWrapper", "MarkdownPreviewHandler", "SSRHandler", "NotFoundHandler"];
|
|
18
18
|
/** Union of all registered handler names. */
|
|
19
19
|
export type HandlerName = (typeof HANDLER_NAMES)[number];
|
|
20
20
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAQlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA0BpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAQlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA0BpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA+DrE,OAAO,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAMtF,2CAA2C;AAC3C,eAAO,MAAM,aAAa,qqBAkChB,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,mBAAwB,GAC7B;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAuB5D;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CAC/C;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,qBAAsC,GAC3C,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAsYnF;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -43,6 +43,7 @@ import { MarkdownPreviewHandler } from "../handlers/preview/markdown-preview.han
|
|
|
43
43
|
import { OpenAPIHandler } from "../handlers/request/openapi.handler.js";
|
|
44
44
|
import { OpenAPIDocsHandler } from "../handlers/request/openapi-docs.handler.js";
|
|
45
45
|
import { InternalAgentsListHandler } from "../handlers/request/internal-agents-list.handler.js";
|
|
46
|
+
import { InternalTasksListHandler } from "../handlers/request/internal-tasks-list.handler.js";
|
|
46
47
|
import { AgentStreamHandler } from "../handlers/request/agent-stream.handler.js";
|
|
47
48
|
import { AgentRunResumeHandler } from "../handlers/request/agent-run-resume.handler.js";
|
|
48
49
|
import { AgentRunCancelHandler } from "../handlers/request/agent-run-cancel.handler.js";
|
|
@@ -83,6 +84,7 @@ export const HANDLER_NAMES = [
|
|
|
83
84
|
"OpenAPIHandler",
|
|
84
85
|
"OpenAPIDocsHandler",
|
|
85
86
|
"InternalAgentsListHandler",
|
|
87
|
+
"InternalTasksListHandler",
|
|
86
88
|
"AgentStreamHandler",
|
|
87
89
|
"AgentRunResumeHandler",
|
|
88
90
|
"AgentRunCancelHandler",
|
|
@@ -118,6 +120,7 @@ const handlerFactories = {
|
|
|
118
120
|
OpenAPIHandler: () => new OpenAPIHandler(),
|
|
119
121
|
OpenAPIDocsHandler: () => new OpenAPIDocsHandler(),
|
|
120
122
|
InternalAgentsListHandler: () => new InternalAgentsListHandler(),
|
|
123
|
+
InternalTasksListHandler: () => new InternalTasksListHandler(),
|
|
121
124
|
AgentStreamHandler: () => new AgentStreamHandler(),
|
|
122
125
|
AgentRunResumeHandler: () => new AgentRunResumeHandler(),
|
|
123
126
|
AgentRunCancelHandler: () => new AgentRunCancelHandler(),
|
|
@@ -19,6 +19,11 @@ export declare class ProjectIsolationManager {
|
|
|
19
19
|
checkRequest(projectSlug: string | undefined): IsolationCheckResult;
|
|
20
20
|
startRequest(projectSlug: string | undefined): void;
|
|
21
21
|
completeRequest(projectSlug: string | undefined, timedOut: boolean): void;
|
|
22
|
+
/**
|
|
23
|
+
* Record a worker crash for a project. This counts as a failure
|
|
24
|
+
* toward the circuit breaker threshold and evicts the worker.
|
|
25
|
+
*/
|
|
26
|
+
recordWorkerCrash(projectSlug: string | undefined): void;
|
|
22
27
|
getStats(): Record<string, {
|
|
23
28
|
inFlight: number;
|
|
24
29
|
recentFailures: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-isolation.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/project-isolation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project-isolation.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/project-isolation.ts"],"names":[],"mappings":"AAUA,UAAU,sBAAsB;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAUD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,eAAe,CAAqD;gBAEhE,MAAM,GAAE,OAAO,CAAC,sBAAsB,CAAM;IAKxD,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,gBAAgB;IAgBxB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB;IAsCnE,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAQnD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IA4BzE;;;OAGG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAoCxD,QAAQ,IAAI,MAAM,CAChB,MAAM,EACN;QACE,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CACF;IAyBD,QAAQ,IAAI,IAAI;CAajB;AAED,eAAO,MAAM,gBAAgB,yBAI3B,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as dntShim from "../../../_dnt.shims.js";
|
|
2
2
|
import { serverLogger } from "../../utils/index.js";
|
|
3
3
|
import { getEnvNumber, unrefTimer } from "../../platform/compat/process.js";
|
|
4
|
+
import { getWorkerPool, isWorkerIsolationEnabled, } from "../../security/sandbox/worker-pool.js";
|
|
4
5
|
const logger = serverLogger.component("project-isolation");
|
|
5
6
|
const DEFAULT_CONFIG = {
|
|
6
7
|
maxConcurrentPerProject: 20,
|
|
@@ -106,6 +107,40 @@ export class ProjectIsolationManager {
|
|
|
106
107
|
resetAfterMs: this.config.circuitResetTimeMs,
|
|
107
108
|
});
|
|
108
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Record a worker crash for a project. This counts as a failure
|
|
112
|
+
* toward the circuit breaker threshold and evicts the worker.
|
|
113
|
+
*/
|
|
114
|
+
recordWorkerCrash(projectSlug) {
|
|
115
|
+
if (!projectSlug)
|
|
116
|
+
return;
|
|
117
|
+
const state = this.getOrCreateState(projectSlug);
|
|
118
|
+
const now = Date.now();
|
|
119
|
+
state.failures.push(now);
|
|
120
|
+
state.failures = state.failures.filter((t) => now - t < this.config.failureWindowMs);
|
|
121
|
+
logger.warn("Worker crash recorded", {
|
|
122
|
+
projectSlug,
|
|
123
|
+
recentFailures: state.failures.length,
|
|
124
|
+
});
|
|
125
|
+
// Evict the crashed worker from the pool
|
|
126
|
+
if (isWorkerIsolationEnabled()) {
|
|
127
|
+
try {
|
|
128
|
+
getWorkerPool().evictWorker(projectSlug);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Pool may not be initialized
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (state.failures.length < this.config.circuitBreakerThreshold)
|
|
135
|
+
return;
|
|
136
|
+
state.circuitOpenedAt = now;
|
|
137
|
+
logger.error("Circuit opened due to worker crashes", {
|
|
138
|
+
projectSlug,
|
|
139
|
+
recentFailures: state.failures.length,
|
|
140
|
+
threshold: this.config.circuitBreakerThreshold,
|
|
141
|
+
resetAfterMs: this.config.circuitResetTimeMs,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
109
144
|
getStats() {
|
|
110
145
|
const stats = {};
|
|
111
146
|
for (const [slug, state] of this.projects.entries()) {
|
|
@@ -123,6 +158,15 @@ export class ProjectIsolationManager {
|
|
|
123
158
|
if (this.cleanupInterval)
|
|
124
159
|
clearInterval(this.cleanupInterval);
|
|
125
160
|
this.projects.clear();
|
|
161
|
+
// Shut down the worker pool if isolation is enabled
|
|
162
|
+
if (isWorkerIsolationEnabled()) {
|
|
163
|
+
try {
|
|
164
|
+
getWorkerPool().shutdown();
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Pool may not be initialized
|
|
168
|
+
}
|
|
169
|
+
}
|
|
126
170
|
}
|
|
127
171
|
}
|
|
128
172
|
export const projectIsolation = new ProjectIsolationManager({
|
|
@@ -13,5 +13,12 @@
|
|
|
13
13
|
*
|
|
14
14
|
* @module server/shared/renderer/memory/pressure
|
|
15
15
|
*/
|
|
16
|
+
type MemoryPressureLevel = "normal" | "warning" | "high" | "critical";
|
|
16
17
|
export declare function shouldRejectDueToMemory(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Get current memory pressure level for use by the worker pool
|
|
20
|
+
* to decide whether to evict idle workers.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getMemoryPressureLevel(): MemoryPressureLevel;
|
|
23
|
+
export {};
|
|
17
24
|
//# sourceMappingURL=pressure.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pressure.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/shared/renderer/memory/pressure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"pressure.d.ts","sourceRoot":"","sources":["../../../../../../src/src/server/shared/renderer/memory/pressure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AASH,KAAK,mBAAmB,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AA+BtE,wBAAgB,uBAAuB,IAAI,OAAO,CAMjD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,mBAAmB,CAE5D"}
|
|
@@ -51,3 +51,10 @@ export function shouldRejectDueToMemory() {
|
|
|
51
51
|
rendererLog.warn("Rejecting request - memory critical", { heapUsedPercent });
|
|
52
52
|
return true;
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Get current memory pressure level for use by the worker pool
|
|
56
|
+
* to decide whether to evict idle workers.
|
|
57
|
+
*/
|
|
58
|
+
export function getMemoryPressureLevel() {
|
|
59
|
+
return getMemoryPressure().level;
|
|
60
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { HandlerContext } from "../types/index.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { discoverTasks, type TaskDiscoveryOptions } from "./discovery.js";
|
|
4
|
+
export declare const ControlPlaneTasksListRequestSchema: z.ZodObject<{
|
|
5
|
+
requestId: z.ZodString;
|
|
6
|
+
projectId: z.ZodString;
|
|
7
|
+
surface: z.ZodEnum<["studio", "channels", "a2a", "mcp"]>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
requestId: string;
|
|
10
|
+
projectId: string;
|
|
11
|
+
surface: "mcp" | "studio" | "channels" | "a2a";
|
|
12
|
+
}, {
|
|
13
|
+
requestId: string;
|
|
14
|
+
projectId: string;
|
|
15
|
+
surface: "mcp" | "studio" | "channels" | "a2a";
|
|
16
|
+
}>;
|
|
17
|
+
export declare const RuntimeTaskSchema: z.ZodObject<{
|
|
18
|
+
id: z.ZodString;
|
|
19
|
+
name: z.ZodString;
|
|
20
|
+
description: z.ZodNullable<z.ZodString>;
|
|
21
|
+
target: z.ZodString;
|
|
22
|
+
sourcePath: z.ZodString;
|
|
23
|
+
inputSchema: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
24
|
+
outputSchema: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
25
|
+
schedulable: z.ZodBoolean;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
description: string | null;
|
|
28
|
+
name: string;
|
|
29
|
+
id: string;
|
|
30
|
+
target: string;
|
|
31
|
+
sourcePath: string;
|
|
32
|
+
outputSchema: Record<string, unknown> | null;
|
|
33
|
+
inputSchema: Record<string, unknown> | null;
|
|
34
|
+
schedulable: boolean;
|
|
35
|
+
}, {
|
|
36
|
+
description: string | null;
|
|
37
|
+
name: string;
|
|
38
|
+
id: string;
|
|
39
|
+
target: string;
|
|
40
|
+
sourcePath: string;
|
|
41
|
+
outputSchema: Record<string, unknown> | null;
|
|
42
|
+
inputSchema: Record<string, unknown> | null;
|
|
43
|
+
schedulable: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
export declare const RuntimeTaskListResponseSchema: z.ZodObject<{
|
|
46
|
+
tasks: z.ZodArray<z.ZodObject<{
|
|
47
|
+
id: z.ZodString;
|
|
48
|
+
name: z.ZodString;
|
|
49
|
+
description: z.ZodNullable<z.ZodString>;
|
|
50
|
+
target: z.ZodString;
|
|
51
|
+
sourcePath: z.ZodString;
|
|
52
|
+
inputSchema: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
53
|
+
outputSchema: z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
54
|
+
schedulable: z.ZodBoolean;
|
|
55
|
+
}, "strip", z.ZodTypeAny, {
|
|
56
|
+
description: string | null;
|
|
57
|
+
name: string;
|
|
58
|
+
id: string;
|
|
59
|
+
target: string;
|
|
60
|
+
sourcePath: string;
|
|
61
|
+
outputSchema: Record<string, unknown> | null;
|
|
62
|
+
inputSchema: Record<string, unknown> | null;
|
|
63
|
+
schedulable: boolean;
|
|
64
|
+
}, {
|
|
65
|
+
description: string | null;
|
|
66
|
+
name: string;
|
|
67
|
+
id: string;
|
|
68
|
+
target: string;
|
|
69
|
+
sourcePath: string;
|
|
70
|
+
outputSchema: Record<string, unknown> | null;
|
|
71
|
+
inputSchema: Record<string, unknown> | null;
|
|
72
|
+
schedulable: boolean;
|
|
73
|
+
}>, "many">;
|
|
74
|
+
}, "strip", z.ZodTypeAny, {
|
|
75
|
+
tasks: {
|
|
76
|
+
description: string | null;
|
|
77
|
+
name: string;
|
|
78
|
+
id: string;
|
|
79
|
+
target: string;
|
|
80
|
+
sourcePath: string;
|
|
81
|
+
outputSchema: Record<string, unknown> | null;
|
|
82
|
+
inputSchema: Record<string, unknown> | null;
|
|
83
|
+
schedulable: boolean;
|
|
84
|
+
}[];
|
|
85
|
+
}, {
|
|
86
|
+
tasks: {
|
|
87
|
+
description: string | null;
|
|
88
|
+
name: string;
|
|
89
|
+
id: string;
|
|
90
|
+
target: string;
|
|
91
|
+
sourcePath: string;
|
|
92
|
+
outputSchema: Record<string, unknown> | null;
|
|
93
|
+
inputSchema: Record<string, unknown> | null;
|
|
94
|
+
schedulable: boolean;
|
|
95
|
+
}[];
|
|
96
|
+
}>;
|
|
97
|
+
export type ControlPlaneTasksListRequest = z.infer<typeof ControlPlaneTasksListRequestSchema>;
|
|
98
|
+
export type RuntimeTask = z.infer<typeof RuntimeTaskSchema>;
|
|
99
|
+
export type RuntimeTaskListResponse = z.infer<typeof RuntimeTaskListResponseSchema>;
|
|
100
|
+
export interface RuntimeTaskDiscoveryDeps {
|
|
101
|
+
discoverTasks: (options: TaskDiscoveryOptions) => ReturnType<typeof discoverTasks>;
|
|
102
|
+
}
|
|
103
|
+
export declare const defaultRuntimeTaskDiscoveryDeps: RuntimeTaskDiscoveryDeps;
|
|
104
|
+
export declare function listRuntimeTasks(ctx: HandlerContext, deps?: RuntimeTaskDiscoveryDeps): Promise<RuntimeTaskListResponse>;
|
|
105
|
+
//# sourceMappingURL=control-plane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../../src/src/task/control-plane.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,eAAO,MAAM,kCAAkC;;;;;;;;;;;;EAI7C,CAAC;AAIH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAS5B,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAExC,CAAC;AAEH,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAC9F,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;CACpF;AAED,eAAO,MAAM,+BAA+B,EAAE,wBAE7C,CAAC;AAUF,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,cAAc,EACnB,IAAI,GAAE,wBAA0D,GAC/D,OAAO,CAAC,uBAAuB,CAAC,CAwBlC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ControlPlaneSurfaceSchema } from "../channels/control-plane.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { discoverTasks } from "./discovery.js";
|
|
4
|
+
export const ControlPlaneTasksListRequestSchema = z.object({
|
|
5
|
+
requestId: z.string().min(1),
|
|
6
|
+
projectId: z.string().min(1),
|
|
7
|
+
surface: ControlPlaneSurfaceSchema,
|
|
8
|
+
});
|
|
9
|
+
const JsonSchemaRecordSchema = z.record(z.unknown());
|
|
10
|
+
export const RuntimeTaskSchema = z.object({
|
|
11
|
+
id: z.string().min(1),
|
|
12
|
+
name: z.string().min(1),
|
|
13
|
+
description: z.string().nullable(),
|
|
14
|
+
target: z.string().min(1),
|
|
15
|
+
sourcePath: z.string().min(1),
|
|
16
|
+
inputSchema: JsonSchemaRecordSchema.nullable(),
|
|
17
|
+
outputSchema: JsonSchemaRecordSchema.nullable(),
|
|
18
|
+
schedulable: z.boolean(),
|
|
19
|
+
});
|
|
20
|
+
export const RuntimeTaskListResponseSchema = z.object({
|
|
21
|
+
tasks: z.array(RuntimeTaskSchema),
|
|
22
|
+
});
|
|
23
|
+
export const defaultRuntimeTaskDiscoveryDeps = {
|
|
24
|
+
discoverTasks,
|
|
25
|
+
};
|
|
26
|
+
function normalizeJsonSchema(value) {
|
|
27
|
+
if (value == null || typeof value !== "object" || Array.isArray(value)) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
export async function listRuntimeTasks(ctx, deps = defaultRuntimeTaskDiscoveryDeps) {
|
|
33
|
+
const discovery = await deps.discoverTasks({
|
|
34
|
+
projectDir: ctx.projectDir,
|
|
35
|
+
adapter: ctx.adapter,
|
|
36
|
+
config: ctx.config,
|
|
37
|
+
debug: ctx.debug ?? false,
|
|
38
|
+
});
|
|
39
|
+
const tasks = discovery.tasks
|
|
40
|
+
.map((task) => RuntimeTaskSchema.parse({
|
|
41
|
+
id: task.id,
|
|
42
|
+
name: task.name,
|
|
43
|
+
description: task.definition.description ?? null,
|
|
44
|
+
target: `task:${task.id}`,
|
|
45
|
+
sourcePath: task.filePath,
|
|
46
|
+
inputSchema: normalizeJsonSchema(task.definition.inputSchema),
|
|
47
|
+
outputSchema: normalizeJsonSchema(task.definition.outputSchema),
|
|
48
|
+
schedulable: task.definition.schedulable ?? true,
|
|
49
|
+
}))
|
|
50
|
+
.sort((left, right) => left.name.localeCompare(right.name));
|
|
51
|
+
return RuntimeTaskListResponseSchema.parse({ tasks });
|
|
52
|
+
}
|
package/esm/src/task/types.d.ts
CHANGED
|
@@ -24,6 +24,12 @@ export interface TaskDefinition {
|
|
|
24
24
|
name?: string;
|
|
25
25
|
/** Task description */
|
|
26
26
|
description?: string;
|
|
27
|
+
/** Optional JSON-schema-like input contract surfaced in APIs/UIs */
|
|
28
|
+
inputSchema?: Record<string, unknown>;
|
|
29
|
+
/** Optional JSON-schema-like output contract surfaced in APIs/UIs */
|
|
30
|
+
outputSchema?: Record<string, unknown>;
|
|
31
|
+
/** Whether this task can be scheduled via cron jobs */
|
|
32
|
+
schedulable?: boolean;
|
|
27
33
|
/** The function to execute */
|
|
28
34
|
run: (ctx: TaskContext) => Promise<unknown> | unknown;
|
|
29
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/task/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,GAAG,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAIxE"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/task/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8BAA8B;IAC9B,GAAG,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAIxE"}
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
* framework source files on disk.
|
|
6
6
|
*/
|
|
7
7
|
import { createFileSystem } from "../../../../platform/compat/fs.js";
|
|
8
|
-
export declare function tryReadWithExtensions(fs: ReturnType<typeof createFileSystem>, basePath: string): Promise<{
|
|
8
|
+
export declare function tryReadWithExtensions(fs: ReturnType<typeof createFileSystem>, basePath: string, existsFn?: (path: string) => Promise<boolean>): Promise<{
|
|
9
9
|
sourcePath: string;
|
|
10
10
|
content: string;
|
|
11
11
|
} | null>;
|
|
12
12
|
/**
|
|
13
13
|
* Resolve a /_vf_modules/ path to the actual framework source file.
|
|
14
14
|
*/
|
|
15
|
-
export declare function resolveFrameworkFile(vfModulePath: string, fs: ReturnType<typeof createFileSystem>): Promise<{
|
|
15
|
+
export declare function resolveFrameworkFile(vfModulePath: string, fs: ReturnType<typeof createFileSystem>, existsFn?: (path: string) => Promise<boolean>): Promise<{
|
|
16
16
|
sourcePath: string;
|
|
17
17
|
content: string;
|
|
18
18
|
} | null>;
|
|
@@ -24,7 +24,7 @@ export declare function resolveFrameworkFile(vfModulePath: string, fs: ReturnTyp
|
|
|
24
24
|
* then falls back to regular src/. This matches resolveFrameworkFile's behavior
|
|
25
25
|
* and ensures consistent path resolution for cycle detection.
|
|
26
26
|
*/
|
|
27
|
-
export declare function resolveVeryfrontSourcePath(specifier: string): Promise<string | null>;
|
|
27
|
+
export declare function resolveVeryfrontSourcePath(specifier: string, existsFn?: (path: string) => Promise<boolean>): Promise<string | null>;
|
|
28
28
|
/**
|
|
29
29
|
* Resolve a relative import path to an absolute framework source path.
|
|
30
30
|
* Given sourcePath=/foo/bar/index.ts and specifier=./Head.tsx, returns /foo/bar/Head.tsx
|
|
@@ -32,5 +32,5 @@ export declare function resolveVeryfrontSourcePath(specifier: string): Promise<s
|
|
|
32
32
|
* Handles both regular source files (.tsx, .ts) and embedded sources (.tsx.src, .ts.src)
|
|
33
33
|
* for compiled binaries.
|
|
34
34
|
*/
|
|
35
|
-
export declare function resolveRelativeFrameworkImport(specifier: string, fromSourcePath: string, _fs: ReturnType<typeof createFileSystem>): Promise<string | null>;
|
|
35
|
+
export declare function resolveRelativeFrameworkImport(specifier: string, fromSourcePath: string, _fs: ReturnType<typeof createFileSystem>, existsFn?: (path: string) => Promise<boolean>): Promise<string | null>;
|
|
36
36
|
//# sourceMappingURL=path-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-resolver.d.ts","sourceRoot":"","sources":["../../../../../../src/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAU,MAAM,mCAAmC,CAAC;AAY7E,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EACvC,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"path-resolver.d.ts","sourceRoot":"","sources":["../../../../../../src/src/transforms/pipeline/stages/ssr-vf-modules/path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAU,MAAM,mCAAmC,CAAC;AAY7E,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAU,GACpD,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAmBzD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,EAAE,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EACvC,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAU,GACpD,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA6DzD;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAU,GACpD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkExB;AAED;;;;;;GAMG;AACH,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EACxC,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAU,GACpD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiExB"}
|