veryfront 0.1.152 → 0.1.154

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.152",
3
+ "version": "0.1.154",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -0,0 +1,33 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ import { z } from "zod";
3
+ import { RunResumeSessionManager } from "./runtime/resume-session.js";
4
+ export declare const AgUiResumeSignalSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
5
+ type: z.ZodLiteral<"tool_result">;
6
+ toolCallId: z.ZodString;
7
+ result: z.ZodUnknown;
8
+ isError: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
9
+ }, z.core.$strip>], "type">;
10
+ export type AgUiResumeSignal = z.infer<typeof AgUiResumeSignalSchema>;
11
+ type ResumeValue = {
12
+ result: unknown;
13
+ isError: boolean;
14
+ };
15
+ export interface AgUiRunControlHandlerOptions {
16
+ resolveRunId?: ((input: {
17
+ request: dntShim.Request;
18
+ requestOrCtx: unknown;
19
+ }) => string | null) | ((input: {
20
+ request: dntShim.Request;
21
+ requestOrCtx: unknown;
22
+ }) => Promise<string | null>);
23
+ }
24
+ export interface AgUiResumeHandlerOptions extends AgUiRunControlHandlerOptions {
25
+ sessionManager: RunResumeSessionManager<ResumeValue>;
26
+ }
27
+ export interface AgUiCancelHandlerOptions<T = unknown> extends AgUiRunControlHandlerOptions {
28
+ sessionManager: RunResumeSessionManager<T>;
29
+ }
30
+ export declare function createAgUiResumeHandler(options: AgUiResumeHandlerOptions): (requestOrCtx: unknown) => Promise<dntShim.Response>;
31
+ export declare function createAgUiCancelHandler<T = unknown>(options: AgUiCancelHandlerOptions<T>): (requestOrCtx: unknown) => Promise<dntShim.Response>;
32
+ export {};
33
+ //# sourceMappingURL=ag-ui-run-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ag-ui-run-control.d.ts","sourceRoot":"","sources":["../../../src/src/agent/ag-ui-run-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAEL,uBAAuB,EAGxB,MAAM,6BAA6B,CAAC;AAKrC,eAAO,MAAM,sBAAsB;;;;;2BAOjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAgCF,MAAM,WAAW,4BAA4B;IAC3C,YAAY,CAAC,EACT,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,GAAG,IAAI,CAAC,GAC/E,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CAC9F;AAED,MAAM,WAAW,wBAAyB,SAAQ,4BAA4B;IAC5E,cAAc,EAAE,uBAAuB,CAAC,WAAW,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,wBAAwB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,4BAA4B;IACzF,cAAc,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;CAC5C;AAaD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAsDtD;AAED,wBAAgB,uBAAuB,CAAC,CAAC,GAAG,OAAO,EACjD,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,GACnC,CAAC,YAAY,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAgBtD"}
@@ -0,0 +1,102 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ import { z } from "zod";
3
+ import { INVALID_ARGUMENT } from "../errors/index.js";
4
+ import { RunNotActiveError, WaitConflictError, WaitNotPendingError, } from "./runtime/resume-session.js";
5
+ const RESUME_PATH_REGEX = /^\/api\/ag-ui\/runs\/([^/]+)\/resume$/;
6
+ const CANCEL_PATH_REGEX = /^\/api\/ag-ui\/runs\/([^/]+)$/;
7
+ export const AgUiResumeSignalSchema = z.discriminatedUnion("type", [
8
+ z.object({
9
+ type: z.literal("tool_result"),
10
+ toolCallId: z.string().min(1).max(128),
11
+ result: z.unknown(),
12
+ isError: z.boolean().optional().default(false),
13
+ }),
14
+ ]);
15
+ function isRequest(value) {
16
+ return (typeof value === "object" &&
17
+ value !== null &&
18
+ "json" in value &&
19
+ typeof value.json === "function" &&
20
+ "url" in value &&
21
+ typeof value.url === "string" &&
22
+ "method" in value &&
23
+ typeof value.method === "string");
24
+ }
25
+ function extractRequest(requestOrCtx) {
26
+ if (isRequest(requestOrCtx))
27
+ return requestOrCtx;
28
+ if (typeof requestOrCtx === "object" && requestOrCtx !== null && "request" in requestOrCtx) {
29
+ const candidate = requestOrCtx.request;
30
+ if (isRequest(candidate))
31
+ return candidate;
32
+ }
33
+ throw INVALID_ARGUMENT.create({
34
+ detail: "Invalid handler argument: expected Request or APIContext",
35
+ });
36
+ }
37
+ function getRunId(pathname, regex) {
38
+ return regex.exec(pathname)?.[1] ?? null;
39
+ }
40
+ async function resolveRunId(requestOrCtx, request, options, regex) {
41
+ const explicit = await options?.resolveRunId?.({ request, requestOrCtx });
42
+ if (explicit)
43
+ return explicit;
44
+ return getRunId(new URL(request.url).pathname, regex);
45
+ }
46
+ export function createAgUiResumeHandler(options) {
47
+ return async function POST(requestOrCtx) {
48
+ const request = extractRequest(requestOrCtx);
49
+ const runId = await resolveRunId(requestOrCtx, request, options, RESUME_PATH_REGEX);
50
+ if (!runId) {
51
+ return dntShim.Response.json({ error: "Run not found" }, { status: 404 });
52
+ }
53
+ try {
54
+ const parsed = AgUiResumeSignalSchema.parse(await request.json());
55
+ const outcome = options.sessionManager.submitSignal(runId, {
56
+ waitKey: parsed.toolCallId,
57
+ value: {
58
+ result: parsed.result,
59
+ isError: parsed.isError,
60
+ },
61
+ });
62
+ return dntShim.Response.json(outcome, { status: 200 });
63
+ }
64
+ catch (error) {
65
+ if (error instanceof z.ZodError) {
66
+ return dntShim.Response.json({
67
+ error: "Invalid AG-UI resume request",
68
+ details: error.issues.map((issue) => ({
69
+ path: issue.path,
70
+ message: issue.message,
71
+ })),
72
+ }, { status: 400 });
73
+ }
74
+ if (error instanceof WaitConflictError) {
75
+ return dntShim.Response.json({ error: "TOOL_RESULT_CONFLICT" }, { status: 409 });
76
+ }
77
+ if (error instanceof WaitNotPendingError) {
78
+ return dntShim.Response.json({ error: "TOOL_RESULT_NOT_WAITING" }, { status: 409 });
79
+ }
80
+ if (error instanceof RunNotActiveError) {
81
+ return dntShim.Response.json({ error: "RUN_NOT_ACTIVE" }, { status: 410 });
82
+ }
83
+ return dntShim.Response.json({
84
+ error: error instanceof Error ? error.message : "Internal resume failed",
85
+ }, { status: 500 });
86
+ }
87
+ };
88
+ }
89
+ export function createAgUiCancelHandler(options) {
90
+ return async function DELETE(requestOrCtx) {
91
+ const request = extractRequest(requestOrCtx);
92
+ const runId = await resolveRunId(requestOrCtx, request, options, CANCEL_PATH_REGEX);
93
+ if (!runId) {
94
+ return dntShim.Response.json({ error: "Run not found" }, { status: 404 });
95
+ }
96
+ const accepted = options.sessionManager.cancelRun(runId);
97
+ if (accepted) {
98
+ return dntShim.Response.json({ accepted: true }, { status: 202 });
99
+ }
100
+ return new dntShim.Response(null, { status: 204 });
101
+ };
102
+ }
@@ -85,6 +85,7 @@ export { BufferMemory, ConversationMemory, createMemory, createRedisMemory, type
85
85
  export { agentAsTool, createWorkflow, getAgent, getAgentsAsTools, getAllAgentIds, registerAgent, type WorkflowConfig, type WorkflowResult, type WorkflowStep, } from "./composition/index.js";
86
86
  export { agent } from "./factory.js";
87
87
  export { type AgUiRuntimeContextItem, AgUiRuntimeContextItemSchema, type AgUiRuntimeInjectedTool, AgUiRuntimeInjectedToolSchema, type AgUiRuntimeMessage, AgUiRuntimeMessageSchema, type AgUiRuntimeRequest, AgUiRuntimeRequestSchema, } from "./runtime-ag-ui-contract.js";
88
+ export { type AgUiCancelHandlerOptions, type AgUiResumeHandlerOptions, type AgUiResumeSignal, AgUiResumeSignalSchema, createAgUiCancelHandler, createAgUiResumeHandler, } from "./ag-ui-run-control.js";
88
89
  export { type AgUiContextItem, type AgUiHandlerConfigWithAgent, type AgUiHandlerOptions, type AgUiInjectedTool, type AgUiRequest, AgUiRequestSchema, createAgUiHandler, } from "./ag-ui-handler.js";
89
90
  export { type ChatHandlerBeforeStream, type ChatHandlerBeforeStreamContext, type ChatHandlerBeforeStreamResult, type ChatHandlerConfigWithAgent, type ChatHandlerMessageInput, type ChatHandlerOptions, createChatHandler, } from "./chat-handler.js";
90
91
  export { AgentRuntime, RunAlreadyExistsError, RunCancelledError, RunNotActiveError, RunResumeSessionManager, type RunResumeSessionManagerOptions, type RunSessionStatus, type SubmitResumeValueOutcome, WaitConflictError, WaitNotPendingError, } from "./runtime/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,OAAO,yBAAyB,CAAC;AAGjC,YAAY,EACV,KAAK,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,OAAO,IAAI,YAAY,EACvB,WAAW,EACX,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,KAAK,MAAM,EACX,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,iBAAiB,EACtB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,KAAK,uBAAuB,EAC5B,6BAA6B,EAC7B,KAAK,kBAAkB,EACvB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,8BAA8B,EACnC,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,OAAO,yBAAyB,CAAC;AAGjC,YAAY,EACV,KAAK,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,OAAO,IAAI,YAAY,EACvB,WAAW,EACX,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,KAAK,MAAM,EACX,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,WAAW,EACX,KAAK,iBAAiB,EACtB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,WAAW,EACX,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EACL,KAAK,sBAAsB,EAC3B,4BAA4B,EAC5B,KAAK,uBAAuB,EAC5B,6BAA6B,EAC7B,KAAK,kBAAkB,EACvB,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACnC,KAAK,6BAA6B,EAClC,KAAK,0BAA0B,EAC/B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,8BAA8B,EACnC,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
@@ -84,6 +84,7 @@ export { BufferMemory, ConversationMemory, createMemory, createRedisMemory, Redi
84
84
  export { agentAsTool, createWorkflow, getAgent, getAgentsAsTools, getAllAgentIds, registerAgent, } from "./composition/index.js";
85
85
  export { agent } from "./factory.js";
86
86
  export { AgUiRuntimeContextItemSchema, AgUiRuntimeInjectedToolSchema, AgUiRuntimeMessageSchema, AgUiRuntimeRequestSchema, } from "./runtime-ag-ui-contract.js";
87
+ export { AgUiResumeSignalSchema, createAgUiCancelHandler, createAgUiResumeHandler, } from "./ag-ui-run-control.js";
87
88
  export { AgUiRequestSchema, createAgUiHandler, } from "./ag-ui-handler.js";
88
89
  export { createChatHandler, } from "./chat-handler.js";
89
90
  export { AgentRuntime, RunAlreadyExistsError, RunCancelledError, RunNotActiveError, RunResumeSessionManager, WaitConflictError, WaitNotPendingError, } from "./runtime/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAUtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA6HD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CA0Nf"}
1
+ {"version":3,"file":"chat-stream-handler.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/chat-stream-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAqB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAWtF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC1C,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAChF;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,KAAK,IAAI,CAAC;CACZ;AA4FD,wBAAgB,iBAAiB,IAAI,eAAe,CAQnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,+BAA+B,EAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,CAAC,EAAE,mBAAmB,EAC/B,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CA0Nf"}
@@ -13,6 +13,7 @@ import { serverLogger } from "../../utils/index.js";
13
13
  import { isAnyDebugEnabled } from "../../utils/constants/env.js";
14
14
  import { setActiveSpanAttributes, withSpan } from "../../observability/tracing/otlp-setup.js";
15
15
  import { getHostEnv } from "../../platform/compat/process.js";
16
+ import { stringifyToolError, throwIfAborted } from "./error-utils.js";
16
17
  const logger = serverLogger.component("agent");
17
18
  function isRecord(value) {
18
19
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -40,31 +41,6 @@ function normalizeToolInputObject(input) {
40
41
  }
41
42
  return {};
42
43
  }
43
- function createAbortError(reason) {
44
- if (reason instanceof Error) {
45
- return reason;
46
- }
47
- return new DOMException(typeof reason === "string" && reason.length > 0 ? reason : "The operation was aborted", "AbortError");
48
- }
49
- function throwIfAborted(abortSignal) {
50
- if (abortSignal?.aborted) {
51
- throw createAbortError(abortSignal.reason);
52
- }
53
- }
54
- function stringifyToolError(output) {
55
- if (typeof output === "string" && output.length > 0) {
56
- return output;
57
- }
58
- if (output instanceof Error && typeof output.message === "string" && output.message.length > 0) {
59
- return output.message;
60
- }
61
- try {
62
- return JSON.stringify(output);
63
- }
64
- catch {
65
- return String(output);
66
- }
67
- }
68
44
  function summarizeDebugValue(value) {
69
45
  if (value instanceof Error) {
70
46
  return {
@@ -0,0 +1,4 @@
1
+ export declare function createAbortError(reason?: unknown): Error;
2
+ export declare function throwIfAborted(abortSignal?: AbortSignal): void;
3
+ export declare function stringifyToolError(error: unknown): string;
4
+ //# sourceMappingURL=error-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-utils.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/error-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,CASxD;AAED,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAI9D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAczD"}
@@ -0,0 +1,25 @@
1
+ export function createAbortError(reason) {
2
+ if (reason instanceof Error) {
3
+ return reason;
4
+ }
5
+ return new DOMException(typeof reason === "string" && reason.length > 0 ? reason : "The operation was aborted", "AbortError");
6
+ }
7
+ export function throwIfAborted(abortSignal) {
8
+ if (abortSignal?.aborted) {
9
+ throw createAbortError(abortSignal.reason);
10
+ }
11
+ }
12
+ export function stringifyToolError(error) {
13
+ if (typeof error === "string" && error.length > 0) {
14
+ return error;
15
+ }
16
+ if (error instanceof Error && typeof error.message === "string" && error.message.length > 0) {
17
+ return error.message;
18
+ }
19
+ try {
20
+ return JSON.stringify(error);
21
+ }
22
+ catch {
23
+ return String(error);
24
+ }
25
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -39,39 +39,15 @@ import { executeConfiguredTool, getAvailableTools, isDynamicTool, parseToolArgs,
39
39
  import { accumulateUsage, getMaxSteps, normalizeInput } from "./input-utils.js";
40
40
  import { filterToolsForSkill, isToolAllowedBySkill, validateAllowedToolPatterns, } from "../../skill/allowed-tools.js";
41
41
  import { resolveConfiguredAgentModel, resolveRuntimeModel } from "./model-resolution.js";
42
+ import { stringifyToolError, throwIfAborted } from "./error-utils.js";
42
43
  const logger = serverLogger.component("agent");
43
44
  const LOAD_SKILL_TOOL_ID = "load-skill";
44
- function createAbortError(reason) {
45
- if (reason instanceof Error) {
46
- return reason;
47
- }
48
- return new DOMException(typeof reason === "string" && reason.length > 0 ? reason : "The operation was aborted", "AbortError");
49
- }
50
- function throwIfAborted(abortSignal) {
51
- if (abortSignal?.aborted) {
52
- throw createAbortError(abortSignal.reason);
53
- }
54
- }
55
45
  function isAbortError(error, abortSignal) {
56
46
  if (abortSignal?.aborted && error === abortSignal.reason) {
57
47
  return true;
58
48
  }
59
49
  return error instanceof DOMException && error.name === "AbortError";
60
50
  }
61
- function stringifyToolError(error) {
62
- if (typeof error === "string" && error.length > 0) {
63
- return error;
64
- }
65
- if (error instanceof Error && typeof error.message === "string" && error.message.length > 0) {
66
- return error.message;
67
- }
68
- try {
69
- return JSON.stringify(error);
70
- }
71
- catch {
72
- return String(error);
73
- }
74
- }
75
51
  function getToolResultError(result) {
76
52
  if (!result || typeof result !== "object" || !("error" in result)) {
77
53
  return undefined;
@@ -293,24 +293,32 @@ function createImportMapPlugin(projectDir, adapter, config) {
293
293
  logger.debug(`Import map resolved: ${args.path} -> ${absolutePath}`);
294
294
  return { path: absolutePath, namespace: "import-map" };
295
295
  });
296
- build.onLoad({ filter: /.*/, namespace: "import-map" }, wrapWithCurrentContext(async (args) => {
297
- try {
298
- const { filePath, contents } = await readFileWithExtensions(adapter, args.path, FILE_EXTENSIONS, projectDir);
299
- return {
300
- contents,
301
- loader: getLoaderForFile(filePath),
302
- resolveDir: pathHelper.dirname(filePath),
303
- };
304
- }
305
- catch (error) {
306
- const msg = error instanceof Error ? error.message : String(error);
307
- logger.error(`Failed to load file via import map: ${args.path}`, error);
308
- return { errors: [{ text: `Failed to load: ${msg}` }] };
309
- }
296
+ build.onLoad({ filter: /.*/, namespace: "import-map" }, createNamespaceOnLoadHandler({
297
+ adapter,
298
+ projectDir,
299
+ errorLabel: "file via import map",
310
300
  }));
311
301
  },
312
302
  };
313
303
  }
304
+ function createNamespaceOnLoadHandler(options) {
305
+ const { adapter, projectDir, errorLabel } = options;
306
+ return wrapWithCurrentContext(async (args) => {
307
+ try {
308
+ const { filePath, contents } = await readFileWithExtensions(adapter, args.path, FILE_EXTENSIONS, projectDir);
309
+ return {
310
+ contents,
311
+ loader: getLoaderForFile(filePath),
312
+ resolveDir: pathHelper.dirname(filePath),
313
+ };
314
+ }
315
+ catch (error) {
316
+ const msg = error instanceof Error ? error.message : String(error);
317
+ logger.error(`Failed to load ${errorLabel}: ${args.path}`, error);
318
+ return { errors: [{ text: `Failed to load: ${msg}` }] };
319
+ }
320
+ });
321
+ }
314
322
  /** Resolves relative imports through the adapter's virtual FS for remote projects. */
315
323
  function createAdapterResolvePlugin(adapter, projectDir) {
316
324
  return {
@@ -337,20 +345,10 @@ function createAdapterResolvePlugin(adapter, projectDir) {
337
345
  // callbacks fire from the child process message handler, losing the
338
346
  // AsyncLocalStorage store. Without this, MultiProjectFSAdapter.getAdapter()
339
347
  // cannot resolve the per-project adapter and all file reads fail silently.
340
- build.onLoad({ filter: /.*/, namespace: "vf-adapter" }, wrapWithCurrentContext(async (args) => {
341
- try {
342
- const { filePath, contents } = await readFileWithExtensions(adapter, args.path, FILE_EXTENSIONS, projectDir);
343
- return {
344
- contents,
345
- loader: getLoaderForFile(filePath),
346
- resolveDir: pathHelper.dirname(filePath),
347
- };
348
- }
349
- catch (error) {
350
- const msg = error instanceof Error ? error.message : String(error);
351
- logger.error(`Failed to load via adapter: ${args.path}`, error);
352
- return { errors: [{ text: `Failed to load: ${msg}` }] };
353
- }
348
+ build.onLoad({ filter: /.*/, namespace: "vf-adapter" }, createNamespaceOnLoadHandler({
349
+ adapter,
350
+ projectDir,
351
+ errorLabel: "via adapter",
354
352
  }));
355
353
  },
356
354
  };
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.1.152";
1
+ export declare const VERSION = "0.1.154";
2
2
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.152";
3
+ export const VERSION = "0.1.154";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.152",
3
+ "version": "0.1.154",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
package/src/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.152",
3
+ "version": "0.1.154",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "exclude": [
@@ -0,0 +1,161 @@
1
+ import * as dntShim from "../../_dnt.shims.js";
2
+ import { z } from "zod";
3
+ import { INVALID_ARGUMENT } from "../errors/index.js";
4
+ import {
5
+ RunNotActiveError,
6
+ RunResumeSessionManager,
7
+ WaitConflictError,
8
+ WaitNotPendingError,
9
+ } from "./runtime/resume-session.js";
10
+
11
+ const RESUME_PATH_REGEX = /^\/api\/ag-ui\/runs\/([^/]+)\/resume$/;
12
+ const CANCEL_PATH_REGEX = /^\/api\/ag-ui\/runs\/([^/]+)$/;
13
+
14
+ export const AgUiResumeSignalSchema = z.discriminatedUnion("type", [
15
+ z.object({
16
+ type: z.literal("tool_result"),
17
+ toolCallId: z.string().min(1).max(128),
18
+ result: z.unknown(),
19
+ isError: z.boolean().optional().default(false),
20
+ }),
21
+ ]);
22
+
23
+ export type AgUiResumeSignal = z.infer<typeof AgUiResumeSignalSchema>;
24
+
25
+ type ResumeValue = {
26
+ result: unknown;
27
+ isError: boolean;
28
+ };
29
+
30
+ function isRequest(value: unknown): value is dntShim.Request {
31
+ return (
32
+ typeof value === "object" &&
33
+ value !== null &&
34
+ "json" in value &&
35
+ typeof value.json === "function" &&
36
+ "url" in value &&
37
+ typeof value.url === "string" &&
38
+ "method" in value &&
39
+ typeof value.method === "string"
40
+ );
41
+ }
42
+
43
+ function extractRequest(requestOrCtx: unknown): dntShim.Request {
44
+ if (isRequest(requestOrCtx)) return requestOrCtx;
45
+
46
+ if (typeof requestOrCtx === "object" && requestOrCtx !== null && "request" in requestOrCtx) {
47
+ const candidate = (requestOrCtx as Record<string, unknown>).request;
48
+ if (isRequest(candidate)) return candidate;
49
+ }
50
+
51
+ throw INVALID_ARGUMENT.create({
52
+ detail: "Invalid handler argument: expected Request or APIContext",
53
+ });
54
+ }
55
+
56
+ function getRunId(pathname: string, regex: RegExp): string | null {
57
+ return regex.exec(pathname)?.[1] ?? null;
58
+ }
59
+
60
+ export interface AgUiRunControlHandlerOptions {
61
+ resolveRunId?:
62
+ | ((input: { request: dntShim.Request; requestOrCtx: unknown }) => string | null)
63
+ | ((input: { request: dntShim.Request; requestOrCtx: unknown }) => Promise<string | null>);
64
+ }
65
+
66
+ export interface AgUiResumeHandlerOptions extends AgUiRunControlHandlerOptions {
67
+ sessionManager: RunResumeSessionManager<ResumeValue>;
68
+ }
69
+
70
+ export interface AgUiCancelHandlerOptions<T = unknown> extends AgUiRunControlHandlerOptions {
71
+ sessionManager: RunResumeSessionManager<T>;
72
+ }
73
+
74
+ async function resolveRunId(
75
+ requestOrCtx: unknown,
76
+ request: dntShim.Request,
77
+ options: AgUiRunControlHandlerOptions | undefined,
78
+ regex: RegExp,
79
+ ): Promise<string | null> {
80
+ const explicit = await options?.resolveRunId?.({ request, requestOrCtx });
81
+ if (explicit) return explicit;
82
+ return getRunId(new URL(request.url).pathname, regex);
83
+ }
84
+
85
+ export function createAgUiResumeHandler(
86
+ options: AgUiResumeHandlerOptions,
87
+ ): (requestOrCtx: unknown) => Promise<dntShim.Response> {
88
+ return async function POST(requestOrCtx: unknown): Promise<dntShim.Response> {
89
+ const request = extractRequest(requestOrCtx);
90
+ const runId = await resolveRunId(requestOrCtx, request, options, RESUME_PATH_REGEX);
91
+
92
+ if (!runId) {
93
+ return dntShim.Response.json({ error: "Run not found" }, { status: 404 });
94
+ }
95
+
96
+ try {
97
+ const parsed = AgUiResumeSignalSchema.parse(await request.json());
98
+ const outcome = options.sessionManager.submitSignal(runId, {
99
+ waitKey: parsed.toolCallId,
100
+ value: {
101
+ result: parsed.result,
102
+ isError: parsed.isError,
103
+ },
104
+ });
105
+
106
+ return dntShim.Response.json(outcome, { status: 200 });
107
+ } catch (error) {
108
+ if (error instanceof z.ZodError) {
109
+ return dntShim.Response.json(
110
+ {
111
+ error: "Invalid AG-UI resume request",
112
+ details: error.issues.map((issue) => ({
113
+ path: issue.path,
114
+ message: issue.message,
115
+ })),
116
+ },
117
+ { status: 400 },
118
+ );
119
+ }
120
+
121
+ if (error instanceof WaitConflictError) {
122
+ return dntShim.Response.json({ error: "TOOL_RESULT_CONFLICT" }, { status: 409 });
123
+ }
124
+
125
+ if (error instanceof WaitNotPendingError) {
126
+ return dntShim.Response.json({ error: "TOOL_RESULT_NOT_WAITING" }, { status: 409 });
127
+ }
128
+
129
+ if (error instanceof RunNotActiveError) {
130
+ return dntShim.Response.json({ error: "RUN_NOT_ACTIVE" }, { status: 410 });
131
+ }
132
+
133
+ return dntShim.Response.json(
134
+ {
135
+ error: error instanceof Error ? error.message : "Internal resume failed",
136
+ },
137
+ { status: 500 },
138
+ );
139
+ }
140
+ };
141
+ }
142
+
143
+ export function createAgUiCancelHandler<T = unknown>(
144
+ options: AgUiCancelHandlerOptions<T>,
145
+ ): (requestOrCtx: unknown) => Promise<dntShim.Response> {
146
+ return async function DELETE(requestOrCtx: unknown): Promise<dntShim.Response> {
147
+ const request = extractRequest(requestOrCtx);
148
+ const runId = await resolveRunId(requestOrCtx, request, options, CANCEL_PATH_REGEX);
149
+
150
+ if (!runId) {
151
+ return dntShim.Response.json({ error: "Run not found" }, { status: 404 });
152
+ }
153
+
154
+ const accepted = options.sessionManager.cancelRun(runId);
155
+ if (accepted) {
156
+ return dntShim.Response.json({ accepted: true }, { status: 202 });
157
+ }
158
+
159
+ return new dntShim.Response(null, { status: 204 });
160
+ };
161
+ }
@@ -145,6 +145,14 @@ export {
145
145
  type AgUiRuntimeRequest,
146
146
  AgUiRuntimeRequestSchema,
147
147
  } from "./runtime-ag-ui-contract.js";
148
+ export {
149
+ type AgUiCancelHandlerOptions,
150
+ type AgUiResumeHandlerOptions,
151
+ type AgUiResumeSignal,
152
+ AgUiResumeSignalSchema,
153
+ createAgUiCancelHandler,
154
+ createAgUiResumeHandler,
155
+ } from "./ag-ui-run-control.js";
148
156
  export {
149
157
  type AgUiContextItem,
150
158
  type AgUiHandlerConfigWithAgent,
@@ -15,6 +15,7 @@ import { serverLogger } from "../../utils/index.js";
15
15
  import { isAnyDebugEnabled } from "../../utils/constants/env.js";
16
16
  import { setActiveSpanAttributes, withSpan } from "../../observability/tracing/otlp-setup.js";
17
17
  import { getHostEnv } from "../../platform/compat/process.js";
18
+ import { stringifyToolError, throwIfAborted } from "./error-utils.js";
18
19
 
19
20
  const logger = serverLogger.component("agent");
20
21
 
@@ -84,39 +85,6 @@ function normalizeToolInputObject(input: unknown): Record<string, unknown> {
84
85
  return {};
85
86
  }
86
87
 
87
- function createAbortError(reason?: unknown): Error {
88
- if (reason instanceof Error) {
89
- return reason;
90
- }
91
-
92
- return new DOMException(
93
- typeof reason === "string" && reason.length > 0 ? reason : "The operation was aborted",
94
- "AbortError",
95
- );
96
- }
97
-
98
- function throwIfAborted(abortSignal?: AbortSignal): void {
99
- if (abortSignal?.aborted) {
100
- throw createAbortError(abortSignal.reason);
101
- }
102
- }
103
-
104
- function stringifyToolError(output: unknown): string {
105
- if (typeof output === "string" && output.length > 0) {
106
- return output;
107
- }
108
-
109
- if (output instanceof Error && typeof output.message === "string" && output.message.length > 0) {
110
- return output.message;
111
- }
112
-
113
- try {
114
- return JSON.stringify(output);
115
- } catch {
116
- return String(output);
117
- }
118
- }
119
-
120
88
  function summarizeDebugValue(value: unknown): unknown {
121
89
  if (value instanceof Error) {
122
90
  return {
@@ -0,0 +1,32 @@
1
+ export function createAbortError(reason?: unknown): Error {
2
+ if (reason instanceof Error) {
3
+ return reason;
4
+ }
5
+
6
+ return new DOMException(
7
+ typeof reason === "string" && reason.length > 0 ? reason : "The operation was aborted",
8
+ "AbortError",
9
+ );
10
+ }
11
+
12
+ export function throwIfAborted(abortSignal?: AbortSignal): void {
13
+ if (abortSignal?.aborted) {
14
+ throw createAbortError(abortSignal.reason);
15
+ }
16
+ }
17
+
18
+ export function stringifyToolError(error: unknown): string {
19
+ if (typeof error === "string" && error.length > 0) {
20
+ return error;
21
+ }
22
+
23
+ if (error instanceof Error && typeof error.message === "string" && error.message.length > 0) {
24
+ return error.message;
25
+ }
26
+
27
+ try {
28
+ return JSON.stringify(error);
29
+ } catch {
30
+ return String(error);
31
+ }
32
+ }
@@ -100,6 +100,7 @@ import {
100
100
  } from "../../skill/allowed-tools.js";
101
101
  import { resolveConfiguredAgentModel, resolveRuntimeModel } from "./model-resolution.js";
102
102
  import type { RuntimeGenerateToolResult } from "./runtime-tool-types.js";
103
+ import { stringifyToolError, throwIfAborted } from "./error-utils.js";
103
104
 
104
105
  const logger = serverLogger.component("agent");
105
106
  const LOAD_SKILL_TOOL_ID = "load-skill";
@@ -108,23 +109,6 @@ type RuntimeToolFilterConfig = AgentConfig & {
108
109
  __vfAllowedRemoteTools?: string[];
109
110
  };
110
111
 
111
- function createAbortError(reason?: unknown): Error {
112
- if (reason instanceof Error) {
113
- return reason;
114
- }
115
-
116
- return new DOMException(
117
- typeof reason === "string" && reason.length > 0 ? reason : "The operation was aborted",
118
- "AbortError",
119
- );
120
- }
121
-
122
- function throwIfAborted(abortSignal?: AbortSignal): void {
123
- if (abortSignal?.aborted) {
124
- throw createAbortError(abortSignal.reason);
125
- }
126
- }
127
-
128
112
  function isAbortError(error: unknown, abortSignal?: AbortSignal): boolean {
129
113
  if (abortSignal?.aborted && error === abortSignal.reason) {
130
114
  return true;
@@ -133,22 +117,6 @@ function isAbortError(error: unknown, abortSignal?: AbortSignal): boolean {
133
117
  return error instanceof DOMException && error.name === "AbortError";
134
118
  }
135
119
 
136
- function stringifyToolError(error: unknown): string {
137
- if (typeof error === "string" && error.length > 0) {
138
- return error;
139
- }
140
-
141
- if (error instanceof Error && typeof error.message === "string" && error.message.length > 0) {
142
- return error.message;
143
- }
144
-
145
- try {
146
- return JSON.stringify(error);
147
- } catch {
148
- return String(error);
149
- }
150
- }
151
-
152
120
  function getToolResultError(result: unknown): string | undefined {
153
121
  if (!result || typeof result !== "object" || !("error" in result)) {
154
122
  return undefined;
@@ -355,31 +355,45 @@ function createImportMapPlugin(
355
355
 
356
356
  build.onLoad(
357
357
  { filter: /.*/, namespace: "import-map" },
358
- wrapWithCurrentContext(async (args) => {
359
- try {
360
- const { filePath, contents } = await readFileWithExtensions(
361
- adapter,
362
- args.path,
363
- FILE_EXTENSIONS,
364
- projectDir,
365
- );
366
-
367
- return {
368
- contents,
369
- loader: getLoaderForFile(filePath),
370
- resolveDir: pathHelper.dirname(filePath),
371
- };
372
- } catch (error) {
373
- const msg = error instanceof Error ? error.message : String(error);
374
- logger.error(`Failed to load file via import map: ${args.path}`, error);
375
- return { errors: [{ text: `Failed to load: ${msg}` }] };
376
- }
358
+ createNamespaceOnLoadHandler({
359
+ adapter,
360
+ projectDir,
361
+ errorLabel: "file via import map",
377
362
  }),
378
363
  );
379
364
  },
380
365
  };
381
366
  }
382
367
 
368
+ function createNamespaceOnLoadHandler(options: {
369
+ adapter: RuntimeAdapter;
370
+ projectDir: string;
371
+ errorLabel: string;
372
+ }) {
373
+ const { adapter, projectDir, errorLabel } = options;
374
+
375
+ return wrapWithCurrentContext(async (args: { path: string }) => {
376
+ try {
377
+ const { filePath, contents } = await readFileWithExtensions(
378
+ adapter,
379
+ args.path,
380
+ FILE_EXTENSIONS,
381
+ projectDir,
382
+ );
383
+
384
+ return {
385
+ contents,
386
+ loader: getLoaderForFile(filePath),
387
+ resolveDir: pathHelper.dirname(filePath),
388
+ };
389
+ } catch (error) {
390
+ const msg = error instanceof Error ? error.message : String(error);
391
+ logger.error(`Failed to load ${errorLabel}: ${args.path}`, error);
392
+ return { errors: [{ text: `Failed to load: ${msg}` }] };
393
+ }
394
+ });
395
+ }
396
+
383
397
  /** Resolves relative imports through the adapter's virtual FS for remote projects. */
384
398
  function createAdapterResolvePlugin(
385
399
  adapter: RuntimeAdapter,
@@ -420,25 +434,10 @@ function createAdapterResolvePlugin(
420
434
  // cannot resolve the per-project adapter and all file reads fail silently.
421
435
  build.onLoad(
422
436
  { filter: /.*/, namespace: "vf-adapter" },
423
- wrapWithCurrentContext(async (args) => {
424
- try {
425
- const { filePath, contents } = await readFileWithExtensions(
426
- adapter,
427
- args.path,
428
- FILE_EXTENSIONS,
429
- projectDir,
430
- );
431
-
432
- return {
433
- contents,
434
- loader: getLoaderForFile(filePath),
435
- resolveDir: pathHelper.dirname(filePath),
436
- };
437
- } catch (error) {
438
- const msg = error instanceof Error ? error.message : String(error);
439
- logger.error(`Failed to load via adapter: ${args.path}`, error);
440
- return { errors: [{ text: `Failed to load: ${msg}` }] };
441
- }
437
+ createNamespaceOnLoadHandler({
438
+ adapter,
439
+ projectDir,
440
+ errorLabel: "via adapter",
442
441
  }),
443
442
  );
444
443
  },
@@ -1,3 +1,3 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
- export const VERSION = "0.1.152";
3
+ export const VERSION = "0.1.154";