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 +1 -1
- package/esm/src/agent/ag-ui-run-control.d.ts +33 -0
- package/esm/src/agent/ag-ui-run-control.d.ts.map +1 -0
- package/esm/src/agent/ag-ui-run-control.js +102 -0
- package/esm/src/agent/index.d.ts +1 -0
- package/esm/src/agent/index.d.ts.map +1 -1
- package/esm/src/agent/index.js +1 -0
- package/esm/src/agent/runtime/chat-stream-handler.d.ts.map +1 -1
- package/esm/src/agent/runtime/chat-stream-handler.js +1 -25
- package/esm/src/agent/runtime/error-utils.d.ts +4 -0
- package/esm/src/agent/runtime/error-utils.d.ts.map +1 -0
- package/esm/src/agent/runtime/error-utils.js +25 -0
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +1 -25
- package/esm/src/routing/api/module-loader/loader.js +26 -28
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/agent/ag-ui-run-control.ts +161 -0
- package/src/src/agent/index.ts +8 -0
- package/src/src/agent/runtime/chat-stream-handler.ts +1 -33
- package/src/src/agent/runtime/error-utils.ts +32 -0
- package/src/src/agent/runtime/index.ts +1 -33
- package/src/src/routing/api/module-loader/loader.ts +37 -38
- package/src/src/utils/version-constant.ts +1 -1
package/esm/deno.js
CHANGED
|
@@ -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
|
+
}
|
package/esm/src/agent/index.d.ts
CHANGED
|
@@ -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"}
|
package/esm/src/agent/index.js
CHANGED
|
@@ -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;
|
|
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 @@
|
|
|
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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,aAAa,EAGlB,KAAK,OAAO,EAEZ,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS/D,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAUlC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,8BAA8B,EAC9B,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC5E,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAiBxB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AA+
|
|
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" },
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
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" },
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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.
|
|
1
|
+
export declare const VERSION = "0.1.154";
|
|
2
2
|
//# sourceMappingURL=version-constant.d.ts.map
|
package/package.json
CHANGED
package/src/deno.js
CHANGED
|
@@ -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
|
+
}
|
package/src/src/agent/index.ts
CHANGED
|
@@ -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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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
|
},
|