veryfront 0.1.75 → 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.
Files changed (63) hide show
  1. package/README.md +2 -0
  2. package/esm/cli/commands/files/command.d.ts +3 -3
  3. package/esm/deno.d.ts +5 -0
  4. package/esm/deno.js +11 -6
  5. package/esm/src/data/server-data-fetcher.d.ts.map +1 -1
  6. package/esm/src/data/server-data-fetcher.js +17 -1
  7. package/esm/src/jobs/index.d.ts +34 -0
  8. package/esm/src/jobs/index.d.ts.map +1 -0
  9. package/esm/src/jobs/index.js +33 -0
  10. package/esm/src/jobs/jobs-client.d.ts +134 -0
  11. package/esm/src/jobs/jobs-client.d.ts.map +1 -0
  12. package/esm/src/jobs/jobs-client.js +218 -0
  13. package/esm/src/jobs/schemas.d.ts +1304 -0
  14. package/esm/src/jobs/schemas.d.ts.map +1 -0
  15. package/esm/src/jobs/schemas.js +159 -0
  16. package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts +4 -0
  17. package/esm/src/platform/adapters/veryfront-api-client/retry-handler.d.ts.map +1 -1
  18. package/esm/src/platform/adapters/veryfront-api-client/retry-handler.js +12 -6
  19. package/esm/src/proxy/handler.d.ts.map +1 -1
  20. package/esm/src/proxy/handler.js +21 -21
  21. package/esm/src/routing/api/route-executor.d.ts.map +1 -1
  22. package/esm/src/routing/api/route-executor.js +30 -3
  23. package/esm/src/security/deno-permissions.d.ts +1 -1
  24. package/esm/src/security/deno-permissions.d.ts.map +1 -1
  25. package/esm/src/security/deno-permissions.js +2 -1
  26. package/esm/src/security/sandbox/project-worker.d.ts.map +1 -1
  27. package/esm/src/security/sandbox/project-worker.js +2 -2
  28. package/esm/src/security/sandbox/worker-permissions.d.ts.map +1 -1
  29. package/esm/src/security/sandbox/worker-permissions.js +23 -20
  30. package/esm/src/security/sandbox/worker-pool.d.ts.map +1 -1
  31. package/esm/src/security/sandbox/worker-pool.js +17 -14
  32. package/esm/src/security/sandbox/worker-types.d.ts +2 -0
  33. package/esm/src/security/sandbox/worker-types.d.ts.map +1 -1
  34. package/esm/src/security/sandbox/worker-types.js +2 -0
  35. package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts +11 -0
  36. package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts.map +1 -0
  37. package/esm/src/server/handlers/request/internal-tasks-list.handler.js +72 -0
  38. package/esm/src/server/runtime-handler/index.d.ts +1 -1
  39. package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
  40. package/esm/src/server/runtime-handler/index.js +3 -0
  41. package/esm/src/task/control-plane.d.ts +105 -0
  42. package/esm/src/task/control-plane.d.ts.map +1 -0
  43. package/esm/src/task/control-plane.js +52 -0
  44. package/esm/src/task/types.d.ts +6 -0
  45. package/esm/src/task/types.d.ts.map +1 -1
  46. package/package.json +5 -1
  47. package/src/deno.js +11 -6
  48. package/src/src/data/server-data-fetcher.ts +30 -2
  49. package/src/src/jobs/index.ts +85 -0
  50. package/src/src/jobs/jobs-client.ts +503 -0
  51. package/src/src/jobs/schemas.ts +202 -0
  52. package/src/src/platform/adapters/veryfront-api-client/retry-handler.ts +15 -6
  53. package/src/src/proxy/handler.ts +27 -19
  54. package/src/src/routing/api/route-executor.ts +43 -7
  55. package/src/src/security/deno-permissions.ts +2 -1
  56. package/src/src/security/sandbox/project-worker.ts +2 -2
  57. package/src/src/security/sandbox/worker-permissions.ts +22 -19
  58. package/src/src/security/sandbox/worker-pool.ts +21 -13
  59. package/src/src/security/sandbox/worker-types.ts +3 -0
  60. package/src/src/server/handlers/request/internal-tasks-list.handler.ts +103 -0
  61. package/src/src/server/runtime-handler/index.ts +3 -0
  62. package/src/src/task/control-plane.ts +76 -0
  63. package/src/src/task/types.ts +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/src/jobs/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import { z } from "zod";
2
+ export const JobStatusSchema = z.enum([
3
+ "submitted",
4
+ "working",
5
+ "completed",
6
+ "failed",
7
+ "canceled",
8
+ ]);
9
+ export const CronJobStatusSchema = z.enum(["active", "paused", "deleting"]);
10
+ export const ReservedJobTargetFamilySchema = z.enum(["task:*", "workflow:*", "deploy:*"]);
11
+ export const PageInfoSchema = z.object({
12
+ self: z.string().nullable(),
13
+ first: z.literal(null),
14
+ next: z.string().nullable(),
15
+ prev: z.string().nullable(),
16
+ });
17
+ const JsonObjectSchema = z.record(z.unknown());
18
+ export const KnowledgeIngestFileResultSchema = z.object({
19
+ source: z.string(),
20
+ localSourcePath: z.string(),
21
+ outputPath: z.string(),
22
+ remotePath: z.string(),
23
+ slug: z.string(),
24
+ sourceType: z.string(),
25
+ summary: z.string(),
26
+ stats: JsonObjectSchema,
27
+ warnings: z.array(z.string()),
28
+ });
29
+ export const JobResultSchema = z
30
+ .discriminatedUnion("kind", [
31
+ z.object({
32
+ kind: z.literal("knowledge_ingest"),
33
+ files: z.array(KnowledgeIngestFileResultSchema),
34
+ }),
35
+ z.object({
36
+ kind: z.literal("artifacts"),
37
+ artifacts: z.array(z.unknown()),
38
+ }),
39
+ ])
40
+ .nullable();
41
+ export const JobSchema = z.object({
42
+ id: z.string().uuid(),
43
+ project_id: z.string().uuid(),
44
+ environment_id: z.string().uuid().nullable(),
45
+ cron_job_id: z.string().uuid().nullable(),
46
+ batch_id: z.string().uuid().nullable(),
47
+ name: z.string(),
48
+ status: JobStatusSchema,
49
+ target: z.string(),
50
+ config: JsonObjectSchema,
51
+ context_id: z.string().uuid().nullable(),
52
+ timeout_seconds: z.number(),
53
+ backoff_limit: z.number(),
54
+ exit_code: z.number().nullable(),
55
+ failed_reason: z.string().nullable(),
56
+ failure_detail: z.string().nullable(),
57
+ result: JobResultSchema,
58
+ started_at: z.string().nullable(),
59
+ completed_at: z.string().nullable(),
60
+ created_by: z.string().uuid().nullable(),
61
+ created_at: z.string(),
62
+ updated_at: z.string(),
63
+ });
64
+ export const PaginatedJobsResponseSchema = z.object({
65
+ data: z.array(JobSchema),
66
+ page_info: PageInfoSchema,
67
+ });
68
+ export const JobEventSchema = z.object({
69
+ timestamp: z.string(),
70
+ level: z.string(),
71
+ message: z.string(),
72
+ service: z.string(),
73
+ trace_id: z.string().optional(),
74
+ request_id: z.string().optional(),
75
+ metadata: z.record(z.string()).optional(),
76
+ });
77
+ export const JobEventsResponseSchema = z.object({
78
+ entries: z.array(JobEventSchema),
79
+ next_cursor: z.string().nullable(),
80
+ stats: z.object({
81
+ bytes_processed: z.number(),
82
+ lines_processed: z.number(),
83
+ query_time_ms: z.number(),
84
+ }),
85
+ });
86
+ export const JobLogsResponseSchema = z.object({
87
+ logs: z.string().nullable(),
88
+ });
89
+ export const KnowledgeIngestBatchSourceSchema = z.object({
90
+ label: z.string(),
91
+ path: z.string().nullable(),
92
+ upload_id: z.string().uuid().nullable(),
93
+ remote_path: z.string().nullable(),
94
+ warning_count: z.number().int().nonnegative(),
95
+ });
96
+ export const JobBatchStatusCountsSchema = z.object({
97
+ submitted: z.number().int().nonnegative(),
98
+ working: z.number().int().nonnegative(),
99
+ completed: z.number().int().nonnegative(),
100
+ failed: z.number().int().nonnegative(),
101
+ canceled: z.number().int().nonnegative(),
102
+ });
103
+ export const JobBatchResultSchema = z
104
+ .discriminatedUnion("kind", [
105
+ z.object({
106
+ kind: z.literal("knowledge_ingest"),
107
+ total_count: z.number().int().nonnegative(),
108
+ completed_count: z.number().int().nonnegative(),
109
+ processing: z.array(KnowledgeIngestBatchSourceSchema),
110
+ completed: z.array(KnowledgeIngestBatchSourceSchema),
111
+ remaining: z.array(KnowledgeIngestBatchSourceSchema),
112
+ remaining_label: z.enum(["Remaining Files", "Not Ingested Files"]),
113
+ }),
114
+ ])
115
+ .nullable();
116
+ export const JobBatchSchema = z.object({
117
+ id: z.string().uuid(),
118
+ project_id: z.string().uuid(),
119
+ target: z.string().nullable(),
120
+ job_count: z.number().int().nonnegative(),
121
+ status_counts: JobBatchStatusCountsSchema,
122
+ created_at: z.string(),
123
+ updated_at: z.string(),
124
+ result: JobBatchResultSchema,
125
+ });
126
+ export const JobTargetDefinitionSchema = z.object({
127
+ target: z.string(),
128
+ family: z.string(),
129
+ description: z.string(),
130
+ input_schema: JsonObjectSchema,
131
+ output_schema: JsonObjectSchema.nullable(),
132
+ });
133
+ export const JobTargetDefinitionsResponseSchema = z.object({
134
+ reserved_families: z.array(ReservedJobTargetFamilySchema),
135
+ data: z.array(JobTargetDefinitionSchema),
136
+ });
137
+ export const CronJobSchema = z.object({
138
+ id: z.string().uuid(),
139
+ project_id: z.string().uuid(),
140
+ environment_id: z.string().uuid().nullable(),
141
+ name: z.string(),
142
+ status: CronJobStatusSchema,
143
+ target: z.string(),
144
+ schedule: z.string(),
145
+ timezone: z.string(),
146
+ config: JsonObjectSchema,
147
+ timeout_seconds: z.number(),
148
+ backoff_limit: z.number(),
149
+ concurrency_policy: z.string(),
150
+ last_scheduled_at: z.string().nullable(),
151
+ last_successful_at: z.string().nullable(),
152
+ created_by: z.string().uuid().nullable(),
153
+ created_at: z.string(),
154
+ updated_at: z.string(),
155
+ });
156
+ export const PaginatedCronJobsResponseSchema = z.object({
157
+ data: z.array(CronJobSchema),
158
+ page_info: PageInfoSchema,
159
+ });
@@ -1,3 +1,4 @@
1
+ import * as dntShim from "../../../../_dnt.shims.js";
1
2
  export interface RetryConfig {
2
3
  maxRetries: number;
3
4
  initialDelay: number;
@@ -7,6 +8,9 @@ export interface RequestOptions {
7
8
  returnText?: boolean;
8
9
  /** Request timeout in milliseconds. Defaults to 30000ms (30 seconds). */
9
10
  timeoutMs?: number;
11
+ method?: string;
12
+ body?: dntShim.BodyInit | null;
13
+ headers?: dntShim.HeadersInit;
10
14
  }
11
15
  export declare function requestWithRetry(url: string, apiToken: string, retryConfig: RetryConfig, options?: RequestOptions): Promise<unknown>;
12
16
  //# sourceMappingURL=retry-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/retry-handler.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAsHlB"}
1
+ {"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../../../../src/src/platform/adapters/veryfront-api-client/retry-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAUrD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;CAC/B;AAKD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,OAAO,CAAC,CA4HlB"}
@@ -22,12 +22,18 @@ export async function requestWithRetry(url, apiToken, retryConfig, options = {})
22
22
  try {
23
23
  const result = await withSpan(SpanNames.HTTP_CLIENT_FETCH, async () => {
24
24
  const startTime = performance.now();
25
- const headers = new dntShim.Headers({
26
- Authorization: `Bearer ${apiToken}`,
27
- "Content-Type": "application/json",
28
- });
25
+ const headers = new dntShim.Headers(options.headers);
26
+ headers.set("Authorization", `Bearer ${apiToken}`);
27
+ if (!headers.has("Content-Type")) {
28
+ headers.set("Content-Type", "application/json");
29
+ }
29
30
  injectContext(headers);
30
- const response = await dntShim.fetch(url, { headers, signal: controller.signal });
31
+ const response = await dntShim.fetch(url, {
32
+ method: options.method ?? "GET",
33
+ headers,
34
+ body: options.body,
35
+ signal: controller.signal,
36
+ });
31
37
  const duration = performance.now() - startTime;
32
38
  recordApiRequest(response.status);
33
39
  apiLog.debug("Request completed", {
@@ -55,7 +61,7 @@ export async function requestWithRetry(url, apiToken, retryConfig, options = {})
55
61
  const data = options.returnText ? await response.text() : await response.json();
56
62
  return { data, status: response.status, duration };
57
63
  }, {
58
- "http.method": "GET",
64
+ "http.method": options.method ?? "GET",
59
65
  "http.url": url,
60
66
  "http.target": urlPath,
61
67
  "http.host": urlObj.host,
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOnD,eAAO,MAAM,sBAAsB,0MAYzB,CAAC;AA6EX,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAoCD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;0BA8K1B,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC;0BA+NvC,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;;;;;;;0BAlVrD,MAAM,EAAE;;EAgYpC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAwB7F"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/src/proxy/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,eAAO,MAAM,sBAAsB,0MAYzB,CAAC;AA6EX,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AA4CD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;0BA6K1B,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC;0BA+NvC,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;;;;;;;0BAjVrD,MAAM,EAAE;;EA+XpC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAwB7F"}
@@ -2,10 +2,11 @@ import * as dntShim from "../../_dnt.shims.js";
2
2
  import { TokenManager } from "./token-manager.js";
3
3
  import { parseProjectDomain } from "../server/utils/domain-parser.js";
4
4
  import { createFileSystem } from "../platform/compat/fs.js";
5
- import { cwd } from "../platform/compat/process.js";
5
+ import { cwd, getEnv } from "../platform/compat/process.js";
6
6
  import { join } from "../platform/compat/path/index.js";
7
7
  import { injectContext, ProxySpanNames, withSpan } from "./tracing.js";
8
8
  import { computeContentSourceId } from "../cache/keys.js";
9
+ import { jwtVerify } from "jose";
9
10
  export const INTERNAL_PROXY_HEADERS = [
10
11
  "x-token",
11
12
  "x-project-slug",
@@ -69,23 +70,23 @@ function extractUserToken(cookieHeader) {
69
70
  const match = cookieHeader.match(/(?:^|;\s*)authToken=([^;]+)/);
70
71
  return match?.[1] ? decodeURIComponent(match[1]) : undefined;
71
72
  }
72
- function extractUserIdFromToken(token) {
73
+ async function extractUserIdFromToken(token, log) {
74
+ const jwtSecret = getEnv("JWT_SECRET");
75
+ if (!jwtSecret) {
76
+ log?.warn("JWT_SECRET not configured — cannot verify user token");
77
+ return undefined;
78
+ }
73
79
  try {
74
- const payload = token.split(".")[1];
75
- if (!payload)
76
- return undefined;
77
- // JWT payloads are base64url-encoded: normalize to standard base64 before decoding
78
- let base64 = payload.replace(/-/g, "+").replace(/_/g, "/");
79
- const remainder = base64.length % 4;
80
- if (remainder === 2)
81
- base64 += "==";
82
- else if (remainder === 3)
83
- base64 += "=";
84
- const decoded = JSON.parse(atob(base64));
85
- return decoded?.userId;
80
+ const secret = new TextEncoder().encode(jwtSecret);
81
+ const { payload } = await jwtVerify(token, secret, {
82
+ algorithms: ["HS256"],
83
+ });
84
+ return payload.userId;
86
85
  }
87
- catch (_) {
88
- /* expected: malformed JWT token */
86
+ catch (error) {
87
+ log?.debug("JWT verification failed", {
88
+ error: error instanceof Error ? error.message : String(error),
89
+ });
89
90
  return undefined;
90
91
  }
91
92
  }
@@ -171,7 +172,7 @@ export function createProxyHandler(options) {
171
172
  const returnPath = safePath + url.search;
172
173
  return `https://veryfront.com/sign-in?from=${encodeURIComponent(returnPath)}`;
173
174
  }
174
- function checkProtectedAccess(req, matchingEnv, userToken, users, logContext) {
175
+ async function checkProtectedAccess(req, matchingEnv, userToken, users, logContext) {
175
176
  if (!matchingEnv?.protected)
176
177
  return null;
177
178
  if (!userToken) {
@@ -183,9 +184,8 @@ export function createProxyHandler(options) {
183
184
  });
184
185
  return { status: 302, message: "Authentication required", redirectUrl };
185
186
  }
186
- const userId = extractUserIdFromToken(userToken);
187
+ const userId = await extractUserIdFromToken(userToken, logger);
187
188
  if (!userId) {
188
- // Malformed token — treat as unauthenticated so user can re-sign-in
189
189
  const redirectUrl = makeAuthRedirectUrl(req);
190
190
  logger?.info("Could not extract userId from token", {
191
191
  ...logContext,
@@ -209,7 +209,7 @@ export function createProxyHandler(options) {
209
209
  if (!lookupResult)
210
210
  return { projectId: undefined, releaseId: undefined };
211
211
  const matchingEnv = lookupResult.environments?.find(envMatcher);
212
- const protectionError = checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, logContext);
212
+ const protectionError = await checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, logContext);
213
213
  if (protectionError)
214
214
  return { error: protectionError };
215
215
  return {
@@ -293,7 +293,7 @@ export function createProxyHandler(options) {
293
293
  const matchingEnv = lookupResult.environments?.find((env) => env.domains?.some((d) => d.toLowerCase() === normalizedHost));
294
294
  releaseId = matchingEnv?.active_release_id ?? undefined;
295
295
  environmentId = matchingEnv?.id;
296
- const protectionError = checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, { domain: host });
296
+ const protectionError = await checkProtectedAccess(req, matchingEnv, userToken, lookupResult.users, { domain: host });
297
297
  if (protectionError) {
298
298
  return makeErrorContext(base, protectionError.status, protectionError.message, token, protectionError.redirectUrl);
299
299
  }
@@ -1 +1 @@
1
- {"version":3,"file":"route-executor.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/api/route-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,0BAA0B,CAAC;AA4RlC,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CA6C3B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAuC3B"}
1
+ {"version":3,"file":"route-executor.d.ts","sourceRoot":"","sources":["../../../../src/src/routing/api/route-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,0BAA0B,CAAC;AAgUlC,MAAM,WAAW,mBAAmB;IAClC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CA6C3B;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAuC3B"}
@@ -8,6 +8,7 @@ import { errorToRFC9457Response } from "../../errors/middleware/http-error-bound
8
8
  import { serverLogger as logger } from "../../utils/index.js";
9
9
  import { isDevelopment as isDevelopmentEnv } from "../../build/config/environment.js";
10
10
  import { getWorkerPool, isWorkerIsolationEnabled, } from "../../security/sandbox/worker-pool.js";
11
+ import { MAX_WORKER_BODY_BYTES, } from "../../security/sandbox/worker-types.js";
11
12
  import { getProjectEnvSnapshot } from "../../server/project-env/storage.js";
12
13
  function isDevelopment(adapter) {
13
14
  const env = adapter.env.get("MODE") ??
@@ -85,13 +86,39 @@ function toHeadResponse(response) {
85
86
  // ---------------------------------------------------------------------------
86
87
  // Worker Isolation Helpers
87
88
  // ---------------------------------------------------------------------------
89
+ function checkContentLengthLimit(request) {
90
+ const contentLength = request.headers.get("content-length");
91
+ if (!contentLength)
92
+ return;
93
+ const bytes = parseInt(contentLength, 10);
94
+ if (bytes > MAX_WORKER_BODY_BYTES) {
95
+ throw createError({
96
+ type: "api",
97
+ message: `Request body too large for isolated execution (${(bytes / 1024 / 1024).toFixed(1)} MB, limit ${MAX_WORKER_BODY_BYTES / 1024 / 1024} MB)`,
98
+ });
99
+ }
100
+ }
101
+ async function readBodyWithSizeGuard(request) {
102
+ if (!request.body)
103
+ return null;
104
+ // Fast path: reject before buffering if Content-Length is known
105
+ checkContentLengthLimit(request);
106
+ const body = new Uint8Array(await request.arrayBuffer());
107
+ // Fallback: check actual size for chunked/streaming bodies
108
+ if (body.byteLength > MAX_WORKER_BODY_BYTES) {
109
+ throw createError({
110
+ type: "api",
111
+ message: `Request body too large for isolated execution (${(body.byteLength / 1024 / 1024).toFixed(1)} MB, limit ${MAX_WORKER_BODY_BYTES / 1024 / 1024} MB)`,
112
+ });
113
+ }
114
+ return body;
115
+ }
88
116
  async function serializeRequest(request) {
89
- const body = request.body ? new Uint8Array(await request.arrayBuffer()) : null;
90
117
  return {
91
118
  url: request.url,
92
119
  method: request.method,
93
120
  headers: [...request.headers.entries()],
94
- body,
121
+ body: await readBodyWithSizeGuard(request),
95
122
  };
96
123
  }
97
124
  function deserializeResponse(s) {
@@ -165,7 +192,7 @@ function executePagesRouteIsolated(modulePath, request, match, pathname, adapter
165
192
  return withSpan("api.executePagesRoute.isolated", async () => {
166
193
  try {
167
194
  const pool = getWorkerPool();
168
- const body = request.body ? new Uint8Array(await request.arrayBuffer()) : null;
195
+ const body = await readBodyWithSizeGuard(request);
169
196
  const workerResponse = await pool.execute(projectDir, [projectDir], {
170
197
  type: "execute-pages-route",
171
198
  id: dntShim.crypto.randomUUID(),
@@ -10,7 +10,7 @@
10
10
  * SERVER — CLI server (dev, production, proxy, MCP, split-mode).
11
11
  * Also used by build and test tasks that need equivalent access.
12
12
  */
13
- export declare const SERVER_PERMISSIONS: readonly ["--allow-read", "--allow-write", "--allow-net", "--allow-env", "--allow-run", "--allow-ffi", "--allow-sys"];
13
+ export declare const SERVER_PERMISSIONS: readonly ["--allow-read", "--allow-write", "--allow-net", "--allow-env", "--allow-run", "--allow-sys", "--unstable-worker-options", "--unstable-net"];
14
14
  /**
15
15
  * WORKFLOW_JOB — `ProcessJobExecutor` (RESTRICTED).
16
16
  * Runs user-authored code — no `--allow-run`, `--allow-ffi`, or `--allow-sys`.
@@ -1 +1 @@
1
- {"version":3,"file":"deno-permissions.d.ts","sourceRoot":"","sources":["../../../src/src/security/deno-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,uHAQrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,wBAAwB,0EAK3B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,wBAAwB,2DAI3B,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,yDAI5B,CAAC"}
1
+ {"version":3,"file":"deno-permissions.d.ts","sourceRoot":"","sources":["../../../src/src/security/deno-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,uJASrB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,wBAAwB,0EAK3B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,wBAAwB,2DAI3B,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,yDAI5B,CAAC"}
@@ -16,8 +16,9 @@ export const SERVER_PERMISSIONS = [
16
16
  "--allow-net",
17
17
  "--allow-env",
18
18
  "--allow-run",
19
- "--allow-ffi",
20
19
  "--allow-sys",
20
+ "--unstable-worker-options",
21
+ "--unstable-net",
21
22
  ];
22
23
  /**
23
24
  * WORKFLOW_JOB — `ProcessJobExecutor` (RESTRICTED).
@@ -1 +1 @@
1
- {"version":3,"file":"project-worker.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/project-worker.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAGf,MAAM,mBAAmB,CAAC;AAU3B,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAcD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AAEtE,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,EAAE,oBAAoB;IAMzC,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,kBAAkB,IAAI,OAAO,CAEhC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IA+Bb;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAqCxD;;;;;;;OAOG;IACH,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC;IAgGjE;;OAEG;IACG,SAAS,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BpD;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;OAEG;IACH,SAAS,IAAI,IAAI;IAuBjB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,aAAa;IA+CrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,gBAAgB;CAazB"}
1
+ {"version":3,"file":"project-worker.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/project-worker.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAGf,MAAM,mBAAmB,CAAC;AAW3B,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAcD;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,YAAY,CAAC;AAEtE,qBAAa,aAAa;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,EAAE,oBAAoB;IAMzC,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,kBAAkB,IAAI,OAAO,CAEhC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IA+Bb;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAqCxD;;;;;;;OAOG;IACH,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC;IA+FjE;;OAEG;IACG,SAAS,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BpD;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;OAEG;IACH,SAAS,IAAI,IAAI;IAuBjB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,aAAa;IA+CrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,gBAAgB;CAazB"}
@@ -13,6 +13,7 @@ import { isCompiledBinary } from "../../utils/index.js";
13
13
  import { withSpan } from "../../observability/tracing/otlp-setup.js";
14
14
  import { TIMEOUT_ERROR, UNKNOWN_ERROR } from "../../errors/index.js";
15
15
  const logger = serverLogger.component("project-worker");
16
+ const textEncoder = new TextEncoder();
16
17
  export class ProjectWorker {
17
18
  projectId;
18
19
  worker = null;
@@ -112,7 +113,6 @@ export class ProjectWorker {
112
113
  this._lastActivityAt = Date.now();
113
114
  this._status = "busy";
114
115
  const requestId = request.id;
115
- const encoder = new TextEncoder();
116
116
  return new ReadableStream({
117
117
  start: (controller) => {
118
118
  let timer = dntShim.setTimeout(() => {
@@ -164,7 +164,7 @@ export class ProjectWorker {
164
164
  this.updateIdleStatus();
165
165
  // If we get an ssr-result, emit it as a single chunk
166
166
  if (response.type === "ssr-result") {
167
- controller.enqueue(encoder.encode(response.html));
167
+ controller.enqueue(textEncoder.encode(response.html));
168
168
  controller.close();
169
169
  }
170
170
  else if (response.type === "error") {
@@ -1 +1 @@
1
- {"version":3,"file":"worker-permissions.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/worker-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EAAE,GAClB,iBAAiB,CAmCnB"}
1
+ {"version":3,"file":"worker-permissions.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/worker-permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;CACd;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EAAE,GAClB,iBAAiB,CA0BnB"}
@@ -11,6 +11,19 @@
11
11
  * See: https://docs.deno.com/runtime/fundamentals/permissions/
12
12
  */
13
13
  import * as dntShim from "../../../_dnt.shims.js";
14
+ // Cache compiled binary check — Deno.execPath() is a syscall that never changes at runtime
15
+ const _isCompiledBinary = (() => {
16
+ try {
17
+ const exec = typeof dntShim.Deno !== "undefined" ? dntShim.Deno.execPath?.() : undefined;
18
+ if (!exec)
19
+ return false;
20
+ const name = exec.split(/[/\\]/).pop()?.toLowerCase() ?? "";
21
+ return name !== "deno" && name !== "deno.exe";
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ })();
14
27
  /**
15
28
  * Build scoped permissions for a project worker.
16
29
  *
@@ -27,26 +40,16 @@ export function buildWorkerPermissions(readPaths) {
27
40
  // is outside the project directory. Rather than trying to enumerate all
28
41
  // read paths, grant full read access — the security boundary is enforced
29
42
  // by denying write/run/ffi/sys, not by restricting reads.
30
- // Check for compiled binary by testing if execPath is NOT "deno"/"deno.exe"
31
- try {
32
- const exec = typeof dntShim.Deno !== "undefined" ? dntShim.Deno.execPath?.() : undefined;
33
- if (exec) {
34
- const name = exec.split(/[/\\]/).pop()?.toLowerCase() ?? "";
35
- if (name !== "deno" && name !== "deno.exe") {
36
- return {
37
- read: true,
38
- write: false,
39
- net: true,
40
- env: true,
41
- run: false,
42
- ffi: false,
43
- sys: false,
44
- };
45
- }
46
- }
47
- }
48
- catch {
49
- // execPath may not be available
43
+ if (_isCompiledBinary) {
44
+ return {
45
+ read: true,
46
+ write: false,
47
+ net: true,
48
+ env: true,
49
+ run: false,
50
+ ffi: false,
51
+ sys: false,
52
+ };
50
53
  }
51
54
  return {
52
55
  read: readPaths.length > 0 ? readPaths : false,
@@ -1 +1 @@
1
- {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/worker-pool.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAWzF,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAmB;IAEjC,OAAO,CAAC,eAAe,CAAqD;IAC5E,OAAO,CAAC,mBAAmB,CAAqD;gBAEpE,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAMlD;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,aAAa;IA0CxE;;;OAGG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC;IAkD1B;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUpC;;OAEG;IACH,QAAQ,IAAI;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;YACtB,MAAM,EAAE,MAAM,CAAC;YACf,YAAY,EAAE,MAAM,CAAC;YACrB,UAAU,EAAE,OAAO,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;KACJ;IA4BD;;OAEG;IACH,UAAU,IAAI;QACZ,uCAAuC;QACvC,cAAc,EAAE,MAAM,CAAC;QACvB,oDAAoD;QACpD,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kDAAkD;QAClD,sBAAsB,EAAE,MAAM,CAAC;QAC/B,qDAAqD;QACrD,WAAW,EAAE,MAAM,CAAC;QACpB,kEAAkE;QAClE,cAAc,EAAE,MAAM,CAAC;KACxB;IAoBD;;OAEG;IACH,QAAQ,IAAI,IAAI;IAgBhB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,aAAa;YA4BP,WAAW;IAmBzB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CA8BjC;AAqBD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAGlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAGhD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAiB1C;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,IAAI,IAAI,CAO1C"}
1
+ {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/worker-pool.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAWzF,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAmB;IAEjC,OAAO,CAAC,eAAe,CAAqD;IAC5E,OAAO,CAAC,mBAAmB,CAAqD;gBAEpE,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAMlD;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,aAAa;IA0CxE;;;OAGG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC;IA0D1B;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUpC;;OAEG;IACH,QAAQ,IAAI;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;YACtB,MAAM,EAAE,MAAM,CAAC;YACf,YAAY,EAAE,MAAM,CAAC;YACrB,UAAU,EAAE,OAAO,CAAC;YACpB,MAAM,EAAE,MAAM,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;SACf,CAAC,CAAC;KACJ;IA4BD;;OAEG;IACH,UAAU,IAAI;QACZ,uCAAuC;QACvC,cAAc,EAAE,MAAM,CAAC;QACvB,oDAAoD;QACpD,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kDAAkD;QAClD,sBAAsB,EAAE,MAAM,CAAC;QAC/B,qDAAqD;QACrD,WAAW,EAAE,MAAM,CAAC;QACpB,kEAAkE;QAClE,cAAc,EAAE,MAAM,CAAC;KACxB;IAoBD;;OAEG;IACH,QAAQ,IAAI,IAAI;IAgBhB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,aAAa;YA4BP,WAAW;IAmBzB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;CA8BjC;AAqBD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAGlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAGhD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAKD,wBAAgB,aAAa,IAAI,UAAU,CAiB1C;AAED,8DAA8D;AAC9D,wBAAgB,mBAAmB,IAAI,IAAI,CAO1C"}
@@ -85,22 +85,25 @@ export class WorkerPool {
85
85
  (entry && Date.now() - entry.createdAt > this.config.maxWorkerAgeMs);
86
86
  if (shouldRecycle && !this.recycling.has(projectId)) {
87
87
  this.recycling.add(projectId);
88
- try {
89
- logger.debug("Recycling worker", {
90
- projectId,
91
- requestCount: worker.requestCount,
92
- ageMs: entry ? Date.now() - entry.createdAt : 0,
93
- reason: worker.requestCount >= this.config.maxRequestsPerWorker
94
- ? "request_count"
95
- : "age",
96
- });
88
+ logger.debug("Recycling worker", {
89
+ projectId,
90
+ requestCount: worker.requestCount,
91
+ ageMs: entry ? Date.now() - entry.createdAt : 0,
92
+ reason: worker.requestCount >= this.config.maxRequestsPerWorker
93
+ ? "request_count"
94
+ : "age",
95
+ });
96
+ // Warm replacement: let the old worker handle this last request,
97
+ // then evict it and create a replacement after the request settles.
98
+ // This avoids cold-start latency for the caller AND prevents the
99
+ // old worker from being terminated while it still has pending work.
100
+ const result = worker.execute(request);
101
+ void result.finally(() => {
97
102
  this.evictWorker(projectId);
98
- const fresh = this.getOrCreateWorker(projectId, readPaths);
99
- return fresh.execute(request);
100
- }
101
- finally {
103
+ this.getOrCreateWorker(projectId, readPaths);
102
104
  this.recycling.delete(projectId);
103
- }
105
+ });
106
+ return result;
104
107
  }
105
108
  return worker.execute(request);
106
109
  }, { "workerPool.projectId": projectId });
@@ -161,5 +161,7 @@ export interface WorkerPoolConfig {
161
161
  /** Per-worker memory budget in MB (default: 64). Workers exceeding this are evicted. */
162
162
  memoryBudgetMb: number;
163
163
  }
164
+ /** Maximum request body size for worker isolation (10 MB) */
165
+ export declare const MAX_WORKER_BODY_BYTES: number;
164
166
  export declare const DEFAULT_WORKER_POOL_CONFIG: WorkerPoolConfig;
165
167
  //# sourceMappingURL=worker-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-types.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/worker-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker-types.d.ts","sourceRoot":"","sources":["../../../../src/src/security/sandbox/worker-types.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@
6
6
  *
7
7
  * @module security/sandbox/worker-types
8
8
  */
9
+ /** Maximum request body size for worker isolation (10 MB) */
10
+ export const MAX_WORKER_BODY_BYTES = 10 * 1024 * 1024;
9
11
  export const DEFAULT_WORKER_POOL_CONFIG = {
10
12
  maxPoolSize: 20,
11
13
  idleTimeoutMs: 300_000,
@@ -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"}