veryfront 0.1.79 → 0.1.81
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.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +2 -0
- package/esm/cli/commands/task/command.d.ts.map +1 -1
- package/esm/cli/commands/task/command.js +2 -0
- package/esm/cli/commands/workflow/command.d.ts.map +1 -1
- package/esm/cli/commands/workflow/command.js +2 -0
- package/esm/cli/utils/write-job-result.d.ts +2 -0
- package/esm/cli/utils/write-job-result.d.ts.map +1 -0
- package/esm/cli/utils/write-job-result.js +16 -0
- package/esm/deno.d.ts +3 -0
- package/esm/deno.js +5 -2
- package/esm/src/jobs/schemas.d.ts +45 -0
- package/esm/src/jobs/schemas.d.ts.map +1 -1
- package/esm/src/jobs/schemas.js +4 -0
- package/esm/src/mcp/server.d.ts.map +1 -1
- package/esm/src/mcp/server.js +45 -9
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +54 -3
- package/esm/src/rendering/script-page-handling.d.ts.map +1 -1
- package/esm/src/rendering/script-page-handling.js +1 -14
- package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +2 -57
- package/esm/src/transforms/npm-import-rewrites.d.ts +26 -0
- package/esm/src/transforms/npm-import-rewrites.d.ts.map +1 -0
- package/esm/src/transforms/npm-import-rewrites.js +97 -0
- package/package.json +1 -1
- package/src/cli/commands/knowledge/command.ts +3 -0
- package/src/cli/commands/task/command.ts +2 -0
- package/src/cli/commands/workflow/command.ts +2 -0
- package/src/cli/utils/write-job-result.ts +23 -0
- package/src/deno.js +5 -2
- package/src/src/jobs/schemas.ts +4 -0
- package/src/src/mcp/server.ts +57 -9
- package/src/src/proxy/handler.ts +63 -2
- package/src/src/rendering/script-page-handling.ts +1 -16
- package/src/src/routing/api/module-loader/loader.ts +2 -58
- package/src/src/transforms/npm-import-rewrites.ts +115 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/knowledge/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,KAAK,SAAS,EAA0C,MAAM,wBAAwB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,EAAuB,KAAK,MAAM,EAAgB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/knowledge/command.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { downloadUploadToFile, listAllUploads } from "../uploads/command.js";
|
|
|
9
9
|
import { putRemoteFileFromLocal } from "../files/command.js";
|
|
10
10
|
import { knowledgeIngestPythonSource } from "./parser-source.js";
|
|
11
11
|
import { createJobUserLogger, serverLogger } from "../../../src/utils/index.js";
|
|
12
|
+
import { writeJobResultIfConfigured } from "../../utils/write-job-result.js";
|
|
12
13
|
const SUPPORTED_EXTENSIONS = new Set([
|
|
13
14
|
".pdf",
|
|
14
15
|
".csv",
|
|
@@ -477,6 +478,7 @@ export async function knowledgeCommand(args) {
|
|
|
477
478
|
progress_current: results.length,
|
|
478
479
|
progress_total: results.length,
|
|
479
480
|
});
|
|
481
|
+
await writeJobResultIfConfigured(results);
|
|
480
482
|
if (options.json) {
|
|
481
483
|
printJson(results);
|
|
482
484
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/task/command.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,WAAY,SAAQ,QAAQ;CAAG;AAEhD,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FrE"}
|
|
@@ -9,6 +9,7 @@ import { cliLogger } from "../../utils/index.js";
|
|
|
9
9
|
import { exitProcess } from "../../utils/index.js";
|
|
10
10
|
import { withProjectSourceContext } from "../../shared/project-source-context.js";
|
|
11
11
|
import { sanitizeJobOutputForLogging } from "../../utils/sanitize-job-output.js";
|
|
12
|
+
import { writeJobResultIfConfigured } from "../../utils/write-job-result.js";
|
|
12
13
|
export async function taskCommand(options) {
|
|
13
14
|
const { discoverTasks } = await import("../../../src/task/discovery.js");
|
|
14
15
|
const { runTask } = await import("../../../src/task/runner.js");
|
|
@@ -76,6 +77,7 @@ export async function taskCommand(options) {
|
|
|
76
77
|
if (result.success) {
|
|
77
78
|
cliLogger.info(`Task completed in ${result.durationMs}ms`);
|
|
78
79
|
if (result.result !== undefined) {
|
|
80
|
+
await writeJobResultIfConfigured(result.result);
|
|
79
81
|
cliLogger.info(`Result: ${JSON.stringify(sanitizeJobOutputForLogging(result.result), null, 2)}`);
|
|
80
82
|
}
|
|
81
83
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/workflow/command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/workflow/command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,MAAM,WAAW,eAAgB,SAAQ,YAAY;CAAG;AA8DxD,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmF7E"}
|
|
@@ -3,6 +3,7 @@ import { cliLogger } from "../../utils/index.js";
|
|
|
3
3
|
import { exitProcess } from "../../utils/index.js";
|
|
4
4
|
import { withProjectSourceContext } from "../../shared/project-source-context.js";
|
|
5
5
|
import { sanitizeJobOutputForLogging } from "../../utils/sanitize-job-output.js";
|
|
6
|
+
import { writeJobResultIfConfigured } from "../../utils/write-job-result.js";
|
|
6
7
|
import { getEnv } from "../../../src/platform/index.js";
|
|
7
8
|
const WORKFLOW_STATUS_POLL_INTERVAL_MS = 1_000;
|
|
8
9
|
async function createWorkflowClient(debug) {
|
|
@@ -27,6 +28,7 @@ async function waitForWorkflowExit(client, runId) {
|
|
|
27
28
|
if (run.status === "completed") {
|
|
28
29
|
cliLogger.info(`Workflow completed: ${runId}`);
|
|
29
30
|
if (run.output !== undefined) {
|
|
31
|
+
await writeJobResultIfConfigured(run.output);
|
|
30
32
|
cliLogger.info(`Result: ${JSON.stringify(sanitizeJobOutputForLogging(run.output), null, 2)}`);
|
|
31
33
|
}
|
|
32
34
|
return;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-job-result.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/write-job-result.ts"],"names":[],"mappings":"AAWA,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAW9E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as dntShim from "../../_dnt.shims.js";
|
|
2
|
+
import { dirname } from "../../src/platform/compat/path/index.js";
|
|
3
|
+
import { sanitizeJobOutputForLogging } from "./sanitize-job-output.js";
|
|
4
|
+
const JOB_RESULT_PATH_ENV = "VERYFRONT_JOB_RESULT_PATH";
|
|
5
|
+
function getJobResultPath() {
|
|
6
|
+
const value = dntShim.Deno.env.get(JOB_RESULT_PATH_ENV)?.trim();
|
|
7
|
+
return value ? value : null;
|
|
8
|
+
}
|
|
9
|
+
export async function writeJobResultIfConfigured(value) {
|
|
10
|
+
const resultPath = getJobResultPath();
|
|
11
|
+
if (!resultPath) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
await dntShim.Deno.mkdir(dirname(resultPath), { recursive: true });
|
|
15
|
+
await dntShim.Deno.writeTextFile(resultPath, JSON.stringify(sanitizeJobOutputForLogging(value), null, 2));
|
|
16
|
+
}
|
package/esm/deno.d.ts
CHANGED
|
@@ -241,6 +241,9 @@ declare namespace _default {
|
|
|
241
241
|
"@ai-sdk/openai": string;
|
|
242
242
|
"@ai-sdk/anthropic": string;
|
|
243
243
|
"@ai-sdk/google": string;
|
|
244
|
+
"@ai-sdk/mistral": string;
|
|
245
|
+
"@ai-sdk/provider": string;
|
|
246
|
+
"@ai-sdk/provider-utils": string;
|
|
244
247
|
tailwindcss: string;
|
|
245
248
|
"tailwindcss/plugin": string;
|
|
246
249
|
"tailwindcss/defaultTheme": string;
|
package/esm/deno.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
"name": "veryfront",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.81",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"nodeModulesDir": "auto",
|
|
6
6
|
"exclude": [
|
|
@@ -251,12 +251,15 @@ export default {
|
|
|
251
251
|
"@ai-sdk/openai": "npm:@ai-sdk/openai@3.0.28",
|
|
252
252
|
"@ai-sdk/anthropic": "npm:@ai-sdk/anthropic@3.0.43",
|
|
253
253
|
"@ai-sdk/google": "npm:@ai-sdk/google@3.0.29",
|
|
254
|
+
"@ai-sdk/mistral": "npm:@ai-sdk/mistral@3.0.14",
|
|
255
|
+
"@ai-sdk/provider": "npm:@ai-sdk/provider@3.0.2",
|
|
256
|
+
"@ai-sdk/provider-utils": "npm:@ai-sdk/provider-utils@4.0.5",
|
|
254
257
|
"tailwindcss": "https://esm.sh/tailwindcss@4.1.8",
|
|
255
258
|
"tailwindcss/plugin": "https://esm.sh/tailwindcss@4.1.8/plugin",
|
|
256
259
|
"tailwindcss/defaultTheme": "https://esm.sh/tailwindcss@4.1.8/defaultTheme",
|
|
257
260
|
"tailwindcss/colors": "https://esm.sh/tailwindcss@4.1.8/colors",
|
|
258
261
|
"redis": "npm:redis@4.6.13",
|
|
259
|
-
"pg": "npm:pg",
|
|
262
|
+
"pg": "npm:pg@8.13.1",
|
|
260
263
|
"jose": "npm:jose@5.9.6",
|
|
261
264
|
"@opentelemetry/api": "npm:@opentelemetry/api@1",
|
|
262
265
|
"@opentelemetry/core": "npm:@opentelemetry/core@1",
|
|
@@ -108,6 +108,15 @@ export declare const JobResultSchema: z.ZodNullable<z.ZodDiscriminatedUnion<"kin
|
|
|
108
108
|
remotePath: string;
|
|
109
109
|
}[];
|
|
110
110
|
kind: "knowledge_ingest";
|
|
111
|
+
}>, z.ZodObject<{
|
|
112
|
+
kind: z.ZodLiteral<"value">;
|
|
113
|
+
value: z.ZodUnknown;
|
|
114
|
+
}, "strip", z.ZodTypeAny, {
|
|
115
|
+
kind: "value";
|
|
116
|
+
value?: unknown;
|
|
117
|
+
}, {
|
|
118
|
+
kind: "value";
|
|
119
|
+
value?: unknown;
|
|
111
120
|
}>, z.ZodObject<{
|
|
112
121
|
kind: z.ZodLiteral<"artifacts">;
|
|
113
122
|
artifacts: z.ZodArray<z.ZodUnknown, "many">;
|
|
@@ -193,6 +202,15 @@ export declare const JobSchema: z.ZodObject<{
|
|
|
193
202
|
remotePath: string;
|
|
194
203
|
}[];
|
|
195
204
|
kind: "knowledge_ingest";
|
|
205
|
+
}>, z.ZodObject<{
|
|
206
|
+
kind: z.ZodLiteral<"value">;
|
|
207
|
+
value: z.ZodUnknown;
|
|
208
|
+
}, "strip", z.ZodTypeAny, {
|
|
209
|
+
kind: "value";
|
|
210
|
+
value?: unknown;
|
|
211
|
+
}, {
|
|
212
|
+
kind: "value";
|
|
213
|
+
value?: unknown;
|
|
196
214
|
}>, z.ZodObject<{
|
|
197
215
|
kind: z.ZodLiteral<"artifacts">;
|
|
198
216
|
artifacts: z.ZodArray<z.ZodUnknown, "many">;
|
|
@@ -232,6 +250,9 @@ export declare const JobSchema: z.ZodObject<{
|
|
|
232
250
|
remotePath: string;
|
|
233
251
|
}[];
|
|
234
252
|
kind: "knowledge_ingest";
|
|
253
|
+
} | {
|
|
254
|
+
kind: "value";
|
|
255
|
+
value?: unknown;
|
|
235
256
|
} | {
|
|
236
257
|
kind: "artifacts";
|
|
237
258
|
artifacts: unknown[];
|
|
@@ -270,6 +291,9 @@ export declare const JobSchema: z.ZodObject<{
|
|
|
270
291
|
remotePath: string;
|
|
271
292
|
}[];
|
|
272
293
|
kind: "knowledge_ingest";
|
|
294
|
+
} | {
|
|
295
|
+
kind: "value";
|
|
296
|
+
value?: unknown;
|
|
273
297
|
} | {
|
|
274
298
|
kind: "artifacts";
|
|
275
299
|
artifacts: unknown[];
|
|
@@ -361,6 +385,15 @@ export declare const PaginatedJobsResponseSchema: z.ZodObject<{
|
|
|
361
385
|
remotePath: string;
|
|
362
386
|
}[];
|
|
363
387
|
kind: "knowledge_ingest";
|
|
388
|
+
}>, z.ZodObject<{
|
|
389
|
+
kind: z.ZodLiteral<"value">;
|
|
390
|
+
value: z.ZodUnknown;
|
|
391
|
+
}, "strip", z.ZodTypeAny, {
|
|
392
|
+
kind: "value";
|
|
393
|
+
value?: unknown;
|
|
394
|
+
}, {
|
|
395
|
+
kind: "value";
|
|
396
|
+
value?: unknown;
|
|
364
397
|
}>, z.ZodObject<{
|
|
365
398
|
kind: z.ZodLiteral<"artifacts">;
|
|
366
399
|
artifacts: z.ZodArray<z.ZodUnknown, "many">;
|
|
@@ -400,6 +433,9 @@ export declare const PaginatedJobsResponseSchema: z.ZodObject<{
|
|
|
400
433
|
remotePath: string;
|
|
401
434
|
}[];
|
|
402
435
|
kind: "knowledge_ingest";
|
|
436
|
+
} | {
|
|
437
|
+
kind: "value";
|
|
438
|
+
value?: unknown;
|
|
403
439
|
} | {
|
|
404
440
|
kind: "artifacts";
|
|
405
441
|
artifacts: unknown[];
|
|
@@ -438,6 +474,9 @@ export declare const PaginatedJobsResponseSchema: z.ZodObject<{
|
|
|
438
474
|
remotePath: string;
|
|
439
475
|
}[];
|
|
440
476
|
kind: "knowledge_ingest";
|
|
477
|
+
} | {
|
|
478
|
+
kind: "value";
|
|
479
|
+
value?: unknown;
|
|
441
480
|
} | {
|
|
442
481
|
kind: "artifacts";
|
|
443
482
|
artifacts: unknown[];
|
|
@@ -494,6 +533,9 @@ export declare const PaginatedJobsResponseSchema: z.ZodObject<{
|
|
|
494
533
|
remotePath: string;
|
|
495
534
|
}[];
|
|
496
535
|
kind: "knowledge_ingest";
|
|
536
|
+
} | {
|
|
537
|
+
kind: "value";
|
|
538
|
+
value?: unknown;
|
|
497
539
|
} | {
|
|
498
540
|
kind: "artifacts";
|
|
499
541
|
artifacts: unknown[];
|
|
@@ -540,6 +582,9 @@ export declare const PaginatedJobsResponseSchema: z.ZodObject<{
|
|
|
540
582
|
remotePath: string;
|
|
541
583
|
}[];
|
|
542
584
|
kind: "knowledge_ingest";
|
|
585
|
+
} | {
|
|
586
|
+
kind: "value";
|
|
587
|
+
value?: unknown;
|
|
543
588
|
} | {
|
|
544
589
|
kind: "artifacts";
|
|
545
590
|
artifacts: unknown[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/src/jobs/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,wEAM1B,CAAC;AAEH,eAAO,MAAM,mBAAmB,6CAA2C,CAAC;AAE5E,eAAO,MAAM,6BAA6B,iDAA+C,CAAC;AAE1F,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAKzB,CAAC;AAIH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU1C,CAAC;AAEH,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/src/jobs/schemas.ts"],"names":[],"mappings":"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"}
|
package/esm/src/jobs/schemas.js
CHANGED
|
@@ -32,6 +32,10 @@ export const JobResultSchema = z
|
|
|
32
32
|
kind: z.literal("knowledge_ingest"),
|
|
33
33
|
files: z.array(KnowledgeIngestFileResultSchema),
|
|
34
34
|
}),
|
|
35
|
+
z.object({
|
|
36
|
+
kind: z.literal("value"),
|
|
37
|
+
value: z.unknown(),
|
|
38
|
+
}),
|
|
35
39
|
z.object({
|
|
36
40
|
kind: z.literal("artifacts"),
|
|
37
41
|
artifacts: z.array(z.unknown()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAG/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAI7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMlD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAG/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAI7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMlD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAOzE,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;AAOzD,UAAU,cAAc;IACtB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC,CAAC;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,iBAAiB,CAAC,CAA0B;IACpD,OAAO,CAAC,kBAAkB,CAAS;gBAEvB,MAAM,EAAE,eAAe;IAQnC;;;OAGG;IACH,oBAAoB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAK3D,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBhG,OAAO,CAAC,QAAQ;IA8BhB,OAAO,CAAC,UAAU;YAYJ,SAAS;IA2BvB,OAAO,CAAC,QAAQ;IAmChB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,YAAY;IA6CpB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,SAAS;IAuCjB,iBAAiB,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IA+E5E,OAAO,CAAC,qBAAqB;YAkBf,YAAY;IAoB1B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,cAAc;YAqBR,oBAAoB;CA0BnC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAElE"}
|
package/esm/src/mcp/server.js
CHANGED
|
@@ -9,6 +9,9 @@ import { withSpan } from "../observability/tracing/otlp-setup.js";
|
|
|
9
9
|
import { VERSION } from "../utils/version.js";
|
|
10
10
|
import { validateContentType } from "../security/input-validation/limits.js";
|
|
11
11
|
import { VeryfrontError } from "../security/input-validation/errors.js";
|
|
12
|
+
import { logger as baseLogger } from "../utils/index.js";
|
|
13
|
+
const logger = baseLogger.component("mcp-server");
|
|
14
|
+
const MAX_REQUEST_BODY_SIZE = 1_048_576; // 1 MB
|
|
12
15
|
function asParamsRecord(params) {
|
|
13
16
|
if (!params || Array.isArray(params))
|
|
14
17
|
return {};
|
|
@@ -20,6 +23,9 @@ export class MCPServer {
|
|
|
20
23
|
integrationsLoaded = false;
|
|
21
24
|
constructor(config) {
|
|
22
25
|
this.config = config;
|
|
26
|
+
if (!config.auth || config.auth.type === "none") {
|
|
27
|
+
logger.warn("MCP server has no authentication configured — all requests will be accepted");
|
|
28
|
+
}
|
|
23
29
|
}
|
|
24
30
|
/**
|
|
25
31
|
* Configure integration tools to be lazily loaded on first tools/list call.
|
|
@@ -207,13 +213,23 @@ export class MCPServer {
|
|
|
207
213
|
}
|
|
208
214
|
createHTTPHandler() {
|
|
209
215
|
return async (request) => {
|
|
216
|
+
const requestOrigin = request.headers.get("Origin");
|
|
210
217
|
if (request.method === "OPTIONS")
|
|
211
|
-
return this.handleCORS();
|
|
218
|
+
return this.handleCORS(requestOrigin);
|
|
212
219
|
if (this.config.auth?.type && this.config.auth.type !== "none") {
|
|
213
220
|
const authorized = await this.validateAuth(request);
|
|
214
221
|
if (!authorized)
|
|
215
222
|
return new dntShim.Response("Unauthorized", { status: 401 });
|
|
216
223
|
}
|
|
224
|
+
// Enforce request body size limit (fast path via Content-Length header)
|
|
225
|
+
const contentLength = request.headers.get("content-length");
|
|
226
|
+
if (contentLength && Number(contentLength) > MAX_REQUEST_BODY_SIZE) {
|
|
227
|
+
return new dntShim.Response(JSON.stringify({
|
|
228
|
+
jsonrpc: "2.0",
|
|
229
|
+
id: null,
|
|
230
|
+
error: { code: -32600, message: "Request body too large" },
|
|
231
|
+
}), { status: 413, headers: { "Content-Type": "application/json" } });
|
|
232
|
+
}
|
|
217
233
|
try {
|
|
218
234
|
validateContentType(request, "application/json");
|
|
219
235
|
}
|
|
@@ -227,7 +243,15 @@ export class MCPServer {
|
|
|
227
243
|
}
|
|
228
244
|
let rpcRequest;
|
|
229
245
|
try {
|
|
230
|
-
|
|
246
|
+
const bodyText = await request.text();
|
|
247
|
+
if (bodyText.length > MAX_REQUEST_BODY_SIZE) {
|
|
248
|
+
return new dntShim.Response(JSON.stringify({
|
|
249
|
+
jsonrpc: "2.0",
|
|
250
|
+
id: null,
|
|
251
|
+
error: { code: -32600, message: "Request body too large" },
|
|
252
|
+
}), { status: 413, headers: { "Content-Type": "application/json" } });
|
|
253
|
+
}
|
|
254
|
+
rpcRequest = JSON.parse(bodyText);
|
|
231
255
|
}
|
|
232
256
|
catch (_) {
|
|
233
257
|
// expected: malformed JSON in request body
|
|
@@ -246,7 +270,7 @@ export class MCPServer {
|
|
|
246
270
|
return new dntShim.Response(JSON.stringify(rpcResponse), {
|
|
247
271
|
headers: {
|
|
248
272
|
"Content-Type": "application/json",
|
|
249
|
-
...this.getCORSHeaders(),
|
|
273
|
+
...this.getCORSHeaders(requestOrigin),
|
|
250
274
|
},
|
|
251
275
|
});
|
|
252
276
|
};
|
|
@@ -275,21 +299,33 @@ export class MCPServer {
|
|
|
275
299
|
if (auth.type !== "bearer")
|
|
276
300
|
return false;
|
|
277
301
|
const token = authHeader.replace("Bearer ", "");
|
|
278
|
-
|
|
302
|
+
// When bearer auth is configured without a validate function, reject all requests
|
|
303
|
+
if (!auth.validate) {
|
|
304
|
+
logger.warn("Bearer auth configured without validate function — rejecting request");
|
|
279
305
|
return false;
|
|
306
|
+
}
|
|
280
307
|
return await auth.validate(token);
|
|
281
308
|
}
|
|
282
|
-
handleCORS() {
|
|
283
|
-
return new dntShim.Response(null, { status: 204, headers: this.getCORSHeaders() });
|
|
309
|
+
handleCORS(requestOrigin) {
|
|
310
|
+
return new dntShim.Response(null, { status: 204, headers: this.getCORSHeaders(requestOrigin) });
|
|
284
311
|
}
|
|
285
|
-
getCORSHeaders() {
|
|
312
|
+
getCORSHeaders(requestOrigin) {
|
|
286
313
|
if (!this.config.cors?.enabled)
|
|
287
314
|
return {};
|
|
288
|
-
const
|
|
315
|
+
const origins = this.config.cors.origins;
|
|
316
|
+
if (!origins || origins.length === 0)
|
|
317
|
+
return {};
|
|
318
|
+
// Match request origin against the configured origins list
|
|
319
|
+
const matchedOrigin = requestOrigin && origins.includes(requestOrigin)
|
|
320
|
+
? requestOrigin
|
|
321
|
+
: undefined;
|
|
322
|
+
if (!matchedOrigin)
|
|
323
|
+
return {};
|
|
289
324
|
return {
|
|
290
|
-
"Access-Control-Allow-Origin":
|
|
325
|
+
"Access-Control-Allow-Origin": matchedOrigin,
|
|
291
326
|
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
292
327
|
"Access-Control-Allow-Headers": "Content-Type, Authorization, X-End-User-Id, X-Project-Id",
|
|
328
|
+
"Vary": "Origin",
|
|
293
329
|
};
|
|
294
330
|
}
|
|
295
331
|
async loadIntegrationTools(config) {
|
|
@@ -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;AAQnD,eAAO,MAAM,sBAAsB,0MAYzB,CAAC;
|
|
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;AAoGX,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;AA8ED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;0BAiL1B,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC;0BA+NvC,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;;;;;;;0BArVrD,MAAM,EAAE;;EAmYpC;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"}
|
package/esm/src/proxy/handler.js
CHANGED
|
@@ -6,7 +6,7 @@ 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
|
+
import { createRemoteJWKSet, decodeProtectedHeader, jwtVerify } from "jose";
|
|
10
10
|
export const INTERNAL_PROXY_HEADERS = [
|
|
11
11
|
"x-token",
|
|
12
12
|
"x-project-slug",
|
|
@@ -20,6 +20,26 @@ export const INTERNAL_PROXY_HEADERS = [
|
|
|
20
20
|
"x-branch-id",
|
|
21
21
|
"x-branch-name",
|
|
22
22
|
];
|
|
23
|
+
const remoteJwksByUrl = new Map();
|
|
24
|
+
function getApiJwks(apiBaseUrl, logger) {
|
|
25
|
+
try {
|
|
26
|
+
const normalizedBaseUrl = apiBaseUrl.endsWith("/") ? apiBaseUrl : `${apiBaseUrl}/`;
|
|
27
|
+
const jwksUrl = new URL(".well-known/jwks.json", normalizedBaseUrl);
|
|
28
|
+
const cacheKey = jwksUrl.toString();
|
|
29
|
+
let jwks = remoteJwksByUrl.get(cacheKey);
|
|
30
|
+
if (!jwks) {
|
|
31
|
+
jwks = createRemoteJWKSet(jwksUrl);
|
|
32
|
+
remoteJwksByUrl.set(cacheKey, jwks);
|
|
33
|
+
}
|
|
34
|
+
return jwks;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
logger?.error("Invalid API base URL for JWKS lookup", error, {
|
|
38
|
+
apiBaseUrl,
|
|
39
|
+
});
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
23
43
|
async function lookupProjectByDomain(domain, apiBaseUrl, token, logger) {
|
|
24
44
|
return withSpan(ProxySpanNames.PROXY_DOMAIN_LOOKUP, async () => {
|
|
25
45
|
const domainWithoutPort = domain.replace(/:\d+$/, "");
|
|
@@ -70,7 +90,38 @@ function extractUserToken(cookieHeader) {
|
|
|
70
90
|
const match = cookieHeader.match(/(?:^|;\s*)authToken=([^;]+)/);
|
|
71
91
|
return match?.[1] ? decodeURIComponent(match[1]) : undefined;
|
|
72
92
|
}
|
|
73
|
-
async function extractUserIdFromToken(token, log) {
|
|
93
|
+
async function extractUserIdFromToken(token, apiBaseUrl, log) {
|
|
94
|
+
let algorithm;
|
|
95
|
+
try {
|
|
96
|
+
algorithm = decodeProtectedHeader(token).alg;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
log?.debug("Failed to decode JWT header", {
|
|
100
|
+
error: error instanceof Error ? error.message : String(error),
|
|
101
|
+
});
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
if (algorithm === "RS256") {
|
|
105
|
+
const jwks = getApiJwks(apiBaseUrl, log);
|
|
106
|
+
if (!jwks)
|
|
107
|
+
return undefined;
|
|
108
|
+
try {
|
|
109
|
+
const { payload } = await jwtVerify(token, jwks, {
|
|
110
|
+
algorithms: ["RS256"],
|
|
111
|
+
});
|
|
112
|
+
return payload.userId;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
log?.debug("RS256 JWT verification failed", {
|
|
116
|
+
error: error instanceof Error ? error.message : String(error),
|
|
117
|
+
});
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (algorithm !== "HS256") {
|
|
122
|
+
log?.debug("Unsupported JWT algorithm", { algorithm: algorithm ?? null });
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
74
125
|
const jwtSecret = getEnv("JWT_SECRET");
|
|
75
126
|
if (!jwtSecret) {
|
|
76
127
|
log?.warn("JWT_SECRET not configured — cannot verify user token");
|
|
@@ -184,7 +235,7 @@ export function createProxyHandler(options) {
|
|
|
184
235
|
});
|
|
185
236
|
return { status: 302, message: "Authentication required", redirectUrl };
|
|
186
237
|
}
|
|
187
|
-
const userId = await extractUserIdFromToken(userToken, logger);
|
|
238
|
+
const userId = await extractUserIdFromToken(userToken, config.apiBaseUrl, logger);
|
|
188
239
|
if (!userId) {
|
|
189
240
|
const redirectUrl = makeAuthRedirectUrl(req);
|
|
190
241
|
logger?.info("Could not extract userId from token", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-page-handling.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/script-page-handling.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"script-page-handling.d.ts","sourceRoot":"","sources":["../../../src/src/rendering/script-page-handling.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAGV,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAenE,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqHD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,UAAU,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,YAAY,CAAC,CAiDvB"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import * as dntShim from "../../_dnt.shims.js";
|
|
8
8
|
import { DEFAULT_DASHBOARD_PORT, rendererLogger } from "../utils/index.js";
|
|
9
|
+
import { rewriteNpmImports } from "../transforms/npm-import-rewrites.js";
|
|
9
10
|
import { dirname, join } from "../platform/compat/path/index.js";
|
|
10
11
|
import { cwd } from "../platform/compat/process.js";
|
|
11
12
|
import { RENDER_ERROR } from "../errors/error-registry.js";
|
|
@@ -16,10 +17,6 @@ import { extractHTMLMetadata, injectHTMLContent, isFullHTMLDocument } from "../h
|
|
|
16
17
|
import { createFileSystem } from "../platform/compat/fs.js";
|
|
17
18
|
import { getEsbuildLoader } from "../utils/path-utils.js";
|
|
18
19
|
const logger = rendererLogger.component("script");
|
|
19
|
-
const NPM_REWRITES = [
|
|
20
|
-
{ pattern: /from\s+["']ai["']/g, replacement: 'from "npm:ai@latest"' },
|
|
21
|
-
{ pattern: /from\s+["']zod["']/g, replacement: 'from "npm:zod@latest"' },
|
|
22
|
-
];
|
|
23
20
|
const ESBUILD_EXTERNALS = [
|
|
24
21
|
"ai",
|
|
25
22
|
"ai/*",
|
|
@@ -208,16 +205,6 @@ async function readFileWithFallback(adapter, modulePath, normalizedPath) {
|
|
|
208
205
|
}
|
|
209
206
|
}
|
|
210
207
|
}
|
|
211
|
-
function rewriteNpmImports(code) {
|
|
212
|
-
const isDeno = typeof dntShim.dntGlobalThis.Deno !== "undefined";
|
|
213
|
-
if (!isDeno)
|
|
214
|
-
return code;
|
|
215
|
-
let result = code;
|
|
216
|
-
for (const { pattern, replacement } of NPM_REWRITES) {
|
|
217
|
-
result = result.replace(pattern, replacement);
|
|
218
|
-
}
|
|
219
|
-
return result;
|
|
220
|
-
}
|
|
221
208
|
async function transpileWithEsbuild(source, modulePath, resolveDir) {
|
|
222
209
|
const { build } = await import("esbuild");
|
|
223
210
|
const loader = getEsbuildLoader(modulePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/routing/api/module-loader/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../../../src/src/routing/api/module-loader/loader.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgL9D,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAejE;AAgBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyBtF"}
|
|
@@ -12,6 +12,7 @@ import { withSpan } from "../../../observability/tracing/otlp-setup.js";
|
|
|
12
12
|
import { isCompiledBinary } from "../../../utils/index.js";
|
|
13
13
|
import { wrapWithCurrentContext } from "../../../platform/adapters/fs/veryfront/multi-project-adapter.js";
|
|
14
14
|
import { isWithinDirectory } from "../../../security/path-validation.js";
|
|
15
|
+
import { rewriteNpmImports } from "../../../transforms/npm-import-rewrites.js";
|
|
15
16
|
const logger = serverLogger.component("api");
|
|
16
17
|
/**
|
|
17
18
|
* Validates that a module path is contained within the project directory.
|
|
@@ -633,63 +634,7 @@ async function rewriteExternalImports(code, projectDir, fs, userDeps = new Map()
|
|
|
633
634
|
}
|
|
634
635
|
}
|
|
635
636
|
if (isDeno) {
|
|
636
|
-
|
|
637
|
-
{ pattern: /from\s+["']ai["']/g, replacement: 'from "npm:ai@latest"' },
|
|
638
|
-
{
|
|
639
|
-
pattern: /from\s+["']@ai-sdk\/anthropic["']/g,
|
|
640
|
-
replacement: 'from "npm:@ai-sdk/anthropic@latest"',
|
|
641
|
-
},
|
|
642
|
-
{
|
|
643
|
-
pattern: /from\s+["']@ai-sdk\/openai["']/g,
|
|
644
|
-
replacement: 'from "npm:@ai-sdk/openai@latest"',
|
|
645
|
-
},
|
|
646
|
-
{
|
|
647
|
-
pattern: /from\s+["']@ai-sdk\/google["']/g,
|
|
648
|
-
replacement: 'from "npm:@ai-sdk/google@latest"',
|
|
649
|
-
},
|
|
650
|
-
{
|
|
651
|
-
pattern: /from\s+["']@ai-sdk\/mistral["']/g,
|
|
652
|
-
replacement: 'from "npm:@ai-sdk/mistral@latest"',
|
|
653
|
-
},
|
|
654
|
-
{
|
|
655
|
-
pattern: /from\s+["']@ai-sdk\/provider["']/g,
|
|
656
|
-
replacement: 'from "npm:@ai-sdk/provider@latest"',
|
|
657
|
-
},
|
|
658
|
-
{
|
|
659
|
-
pattern: /from\s+["']@ai-sdk\/provider-utils["']/g,
|
|
660
|
-
replacement: 'from "npm:@ai-sdk/provider-utils@latest"',
|
|
661
|
-
},
|
|
662
|
-
{ pattern: /from\s+["']zod["']/g, replacement: 'from "npm:zod@latest"' },
|
|
663
|
-
{ pattern: /import\s*\(\s*["']ai["']\s*\)/g, replacement: 'import("npm:ai@latest")' },
|
|
664
|
-
{
|
|
665
|
-
pattern: /import\s*\(\s*["']@ai-sdk\/anthropic["']\s*\)/g,
|
|
666
|
-
replacement: 'import("npm:@ai-sdk/anthropic@latest")',
|
|
667
|
-
},
|
|
668
|
-
{
|
|
669
|
-
pattern: /import\s*\(\s*["']@ai-sdk\/openai["']\s*\)/g,
|
|
670
|
-
replacement: 'import("npm:@ai-sdk/openai@latest")',
|
|
671
|
-
},
|
|
672
|
-
{
|
|
673
|
-
pattern: /import\s*\(\s*["']@ai-sdk\/google["']\s*\)/g,
|
|
674
|
-
replacement: 'import("npm:@ai-sdk/google@latest")',
|
|
675
|
-
},
|
|
676
|
-
{
|
|
677
|
-
pattern: /import\s*\(\s*["']@ai-sdk\/mistral["']\s*\)/g,
|
|
678
|
-
replacement: 'import("npm:@ai-sdk/mistral@latest")',
|
|
679
|
-
},
|
|
680
|
-
{
|
|
681
|
-
pattern: /import\s*\(\s*["']@ai-sdk\/provider["']\s*\)/g,
|
|
682
|
-
replacement: 'import("npm:@ai-sdk/provider@latest")',
|
|
683
|
-
},
|
|
684
|
-
{
|
|
685
|
-
pattern: /import\s*\(\s*["']@ai-sdk\/provider-utils["']\s*\)/g,
|
|
686
|
-
replacement: 'import("npm:@ai-sdk/provider-utils@latest")',
|
|
687
|
-
},
|
|
688
|
-
{ pattern: /import\s*\(\s*["']zod["']\s*\)/g, replacement: 'import("npm:zod@latest")' },
|
|
689
|
-
];
|
|
690
|
-
for (const { pattern, replacement } of rewrites) {
|
|
691
|
-
transformed = transformed.replace(pattern, replacement);
|
|
692
|
-
}
|
|
637
|
+
transformed = rewriteNpmImports(transformed);
|
|
693
638
|
// Rewrite bare Node.js built-in imports to node: prefix for Deno compatibility.
|
|
694
639
|
// npm packages often use require('fs') / from "fs" without the node: prefix.
|
|
695
640
|
for (const mod of NODE_BUILTINS) {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bare specifiers that should be rewritten to their pinned npm: versions.
|
|
3
|
+
* Each must have a corresponding entry in deno.json's import map.
|
|
4
|
+
*/
|
|
5
|
+
declare const REWRITABLE_PACKAGES: readonly ["ai", "@ai-sdk/anthropic", "@ai-sdk/openai", "@ai-sdk/google", "@ai-sdk/mistral", "@ai-sdk/provider", "@ai-sdk/provider-utils", "zod"];
|
|
6
|
+
interface RewriteRule {
|
|
7
|
+
pattern: RegExp;
|
|
8
|
+
replacement: string;
|
|
9
|
+
}
|
|
10
|
+
declare function buildRules(importMap: Record<string, string>): RewriteRule[];
|
|
11
|
+
/**
|
|
12
|
+
* Returns rewrite rules derived from deno.json's import map.
|
|
13
|
+
* Rules are cached after first call.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getNpmRewriteRules(): RewriteRule[];
|
|
16
|
+
/**
|
|
17
|
+
* Apply npm import rewrites to source code.
|
|
18
|
+
* Rewrites bare specifiers to pinned npm: versions from deno.json.
|
|
19
|
+
* No-op on Node.js where bare specifiers resolve via node_modules.
|
|
20
|
+
*/
|
|
21
|
+
export declare function rewriteNpmImports(source: string): string;
|
|
22
|
+
/** Exported for testing */
|
|
23
|
+
export { buildRules, REWRITABLE_PACKAGES };
|
|
24
|
+
/** @internal Reset cached rules — only for testing */
|
|
25
|
+
export declare function _resetCache(): void;
|
|
26
|
+
//# sourceMappingURL=npm-import-rewrites.d.ts.map
|