veryfront 0.1.63 → 0.1.65
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/runtime/index.d.ts +1 -0
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +10 -2
- package/esm/src/channels/control-plane.d.ts +259 -0
- package/esm/src/channels/control-plane.d.ts.map +1 -0
- package/esm/src/channels/control-plane.js +212 -0
- package/esm/src/channels/invoke.d.ts +71 -44
- package/esm/src/channels/invoke.d.ts.map +1 -1
- package/esm/src/channels/invoke.js +33 -114
- package/esm/src/integrations/endpoint-executor.d.ts +1 -0
- package/esm/src/integrations/endpoint-executor.d.ts.map +1 -1
- package/esm/src/integrations/endpoint-executor.js +44 -0
- package/esm/src/internal-agents/ag-ui-sse.d.ts +35 -0
- package/esm/src/internal-agents/ag-ui-sse.d.ts.map +1 -0
- package/esm/src/internal-agents/ag-ui-sse.js +263 -0
- package/esm/src/internal-agents/control-plane-auth.d.ts +20 -0
- package/esm/src/internal-agents/control-plane-auth.d.ts.map +1 -0
- package/esm/src/internal-agents/control-plane-auth.js +56 -0
- package/esm/src/internal-agents/request-body.d.ts +9 -0
- package/esm/src/internal-agents/request-body.d.ts.map +1 -0
- package/esm/src/internal-agents/request-body.js +28 -0
- package/esm/src/internal-agents/run-stream.d.ts +14 -0
- package/esm/src/internal-agents/run-stream.d.ts.map +1 -0
- package/esm/src/internal-agents/run-stream.js +259 -0
- package/esm/src/internal-agents/schema.d.ts +268 -0
- package/esm/src/internal-agents/schema.d.ts.map +1 -0
- package/esm/src/internal-agents/schema.js +71 -0
- package/esm/src/internal-agents/session-manager.d.ts +63 -0
- package/esm/src/internal-agents/session-manager.d.ts.map +1 -0
- package/esm/src/internal-agents/session-manager.js +258 -0
- package/esm/src/platform/adapters/runtime/deno/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/runtime/deno/adapter.js +4 -13
- package/esm/src/platform/compat/process.d.ts.map +1 -1
- package/esm/src/platform/compat/process.js +42 -5
- package/esm/src/server/handlers/request/agent-run-cancel.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/agent-run-cancel.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/agent-run-cancel.handler.js +62 -0
- package/esm/src/server/handlers/request/agent-run-resume.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/agent-run-resume.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/agent-run-resume.handler.js +77 -0
- package/esm/src/server/handlers/request/agent-stream.handler.d.ts +14 -0
- package/esm/src/server/handlers/request/agent-stream.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/agent-stream.handler.js +86 -0
- package/esm/src/server/handlers/request/internal-agents-list.handler.d.ts +11 -0
- package/esm/src/server/handlers/request/internal-agents-list.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/internal-agents-list.handler.js +73 -0
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +8 -0
- package/package.json +1 -1
- package/src/deno.js +1 -1
- package/src/src/agent/runtime/index.ts +12 -2
- package/src/src/channels/control-plane.ts +332 -0
- package/src/src/channels/invoke.ts +44 -164
- package/src/src/integrations/endpoint-executor.ts +51 -0
- package/src/src/internal-agents/ag-ui-sse.ts +327 -0
- package/src/src/internal-agents/control-plane-auth.ts +82 -0
- package/src/src/internal-agents/request-body.ts +42 -0
- package/src/src/internal-agents/run-stream.ts +354 -0
- package/src/src/internal-agents/schema.ts +102 -0
- package/src/src/internal-agents/session-manager.ts +358 -0
- package/src/src/platform/adapters/runtime/deno/adapter.ts +9 -11
- package/src/src/platform/compat/process.ts +56 -3
- package/src/src/server/handlers/request/agent-run-cancel.handler.ts +86 -0
- package/src/src/server/handlers/request/agent-run-resume.handler.ts +108 -0
- package/src/src/server/handlers/request/agent-stream.handler.ts +125 -0
- package/src/src/server/handlers/request/internal-agents-list.handler.ts +100 -0
- package/src/src/server/runtime-handler/index.ts +8 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import type { Agent } from "../../../agent/index.js";
|
|
3
|
+
import { defaultChannelInvokeDeps } from "../../../channels/invoke.js";
|
|
4
|
+
import { type RuntimeAgentDiscoveryDeps } from "../../../channels/control-plane.js";
|
|
5
|
+
import {
|
|
6
|
+
createRuntimeAgentStreamResponse,
|
|
7
|
+
type RuntimeAgentStreamExecutionDeps,
|
|
8
|
+
} from "../../../internal-agents/run-stream.js";
|
|
9
|
+
import {
|
|
10
|
+
ControlPlaneRequestError,
|
|
11
|
+
verifyControlPlaneRequest,
|
|
12
|
+
} from "../../../internal-agents/control-plane-auth.js";
|
|
13
|
+
import {
|
|
14
|
+
INTERNAL_AGENT_STREAM_MAX_BODY_BYTES,
|
|
15
|
+
InternalAgentRequestBodyTooLargeError,
|
|
16
|
+
readInternalAgentRequestBody,
|
|
17
|
+
} from "../../../internal-agents/request-body.js";
|
|
18
|
+
import {
|
|
19
|
+
AgentRunAlreadyExistsError,
|
|
20
|
+
agentRunSessionManager,
|
|
21
|
+
} from "../../../internal-agents/session-manager.js";
|
|
22
|
+
import { RuntimeRunAgentInputSchema } from "../../../internal-agents/schema.js";
|
|
23
|
+
import { BaseHandler } from "../response/base.js";
|
|
24
|
+
import type { HandlerContext, HandlerMetadata, HandlerPriority, HandlerResult } from "../types.js";
|
|
25
|
+
import { PRIORITY_MEDIUM_API } from "../../../utils/constants/index.js";
|
|
26
|
+
|
|
27
|
+
export interface AgentStreamHandlerDeps
|
|
28
|
+
extends RuntimeAgentDiscoveryDeps, RuntimeAgentStreamExecutionDeps {}
|
|
29
|
+
|
|
30
|
+
const defaultDeps: AgentStreamHandlerDeps = {
|
|
31
|
+
...defaultChannelInvokeDeps,
|
|
32
|
+
sessionManager: agentRunSessionManager,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
function applyBuilderHeaders(target: dntShim.Response, source: dntShim.Headers): dntShim.Response {
|
|
36
|
+
const headers = new dntShim.Headers(target.headers);
|
|
37
|
+
for (const [key, value] of source.entries()) {
|
|
38
|
+
if (!headers.has(key)) {
|
|
39
|
+
headers.set(key, value);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return new dntShim.Response(target.body, {
|
|
44
|
+
status: target.status,
|
|
45
|
+
statusText: target.statusText,
|
|
46
|
+
headers,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class AgentStreamHandler extends BaseHandler {
|
|
51
|
+
metadata: HandlerMetadata = {
|
|
52
|
+
name: "AgentStreamHandler",
|
|
53
|
+
priority: PRIORITY_MEDIUM_API as HandlerPriority,
|
|
54
|
+
patterns: [{ pattern: "/internal/agents/stream", exact: true, method: "POST" }],
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
constructor(private readonly deps: AgentStreamHandlerDeps = defaultDeps) {
|
|
58
|
+
super();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async handle(req: dntShim.Request, ctx: HandlerContext): Promise<HandlerResult> {
|
|
62
|
+
if (!this.shouldHandle(req, ctx)) {
|
|
63
|
+
return this.continue();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return this.withProxyContext(ctx, async () => {
|
|
67
|
+
const builder = this.createResponseBuilder(ctx)
|
|
68
|
+
.withCORS(req, ctx.securityConfig?.cors)
|
|
69
|
+
.withSecurity(ctx.securityConfig ?? undefined, req);
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
const rawBody = await readInternalAgentRequestBody(
|
|
73
|
+
req,
|
|
74
|
+
INTERNAL_AGENT_STREAM_MAX_BODY_BYTES,
|
|
75
|
+
);
|
|
76
|
+
const payload = RuntimeRunAgentInputSchema.parse(JSON.parse(rawBody));
|
|
77
|
+
await verifyControlPlaneRequest(req, ctx, rawBody, {
|
|
78
|
+
expectedSubject: payload.runId,
|
|
79
|
+
expectedSurface: "studio",
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
await this.deps.ensureProjectDiscovery(ctx);
|
|
83
|
+
|
|
84
|
+
const agent = this.deps.getAgent(payload.agentId);
|
|
85
|
+
if (!agent) {
|
|
86
|
+
return this.respond(builder.json({ error: "Agent not found" }, 404));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const response = await createRuntimeAgentStreamResponse(payload, agent as Agent, this.deps);
|
|
90
|
+
return this.respond(applyBuilderHeaders(response, builder.headers));
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (error instanceof InternalAgentRequestBodyTooLargeError) {
|
|
93
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (error instanceof ControlPlaneRequestError) {
|
|
97
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (error instanceof SyntaxError) {
|
|
101
|
+
return this.respond(
|
|
102
|
+
builder.json({ error: "Invalid internal agent stream request" }, 400),
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (error instanceof AgentRunAlreadyExistsError) {
|
|
107
|
+
return this.respond(builder.json({ error: error.message }, 409));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (error instanceof Error && error.name === "ZodError") {
|
|
111
|
+
return this.respond(
|
|
112
|
+
builder.json({ error: "Invalid internal agent stream request" }, 400),
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
this.logWarn("Internal agent stream request failed", {
|
|
117
|
+
error: error instanceof Error ? error.message : String(error),
|
|
118
|
+
projectId: ctx.projectId,
|
|
119
|
+
projectSlug: ctx.projectSlug,
|
|
120
|
+
});
|
|
121
|
+
return this.respond(builder.json({ error: "Internal agent stream failed" }, 500));
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import { BaseHandler } from "../response/base.js";
|
|
3
|
+
import type { HandlerContext, HandlerMetadata, HandlerPriority, HandlerResult } from "../types.js";
|
|
4
|
+
import {
|
|
5
|
+
type ControlPlaneAgentsListRequest,
|
|
6
|
+
ControlPlaneAgentsListRequestSchema,
|
|
7
|
+
listRuntimeAgents,
|
|
8
|
+
type RuntimeAgentDiscoveryDeps,
|
|
9
|
+
} from "../../../channels/control-plane.js";
|
|
10
|
+
import { defaultChannelInvokeDeps } from "../../../channels/invoke.js";
|
|
11
|
+
import {
|
|
12
|
+
ControlPlaneRequestError,
|
|
13
|
+
verifyControlPlaneRequest,
|
|
14
|
+
} from "../../../internal-agents/control-plane-auth.js";
|
|
15
|
+
import {
|
|
16
|
+
INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES,
|
|
17
|
+
InternalAgentRequestBodyTooLargeError,
|
|
18
|
+
readInternalAgentRequestBody,
|
|
19
|
+
} from "../../../internal-agents/request-body.js";
|
|
20
|
+
import { PRIORITY_MEDIUM_API } from "../../../utils/constants/index.js";
|
|
21
|
+
import { ZodError } from "zod";
|
|
22
|
+
|
|
23
|
+
export class InternalAgentsListHandler extends BaseHandler {
|
|
24
|
+
metadata: HandlerMetadata = {
|
|
25
|
+
name: "InternalAgentsListHandler",
|
|
26
|
+
priority: PRIORITY_MEDIUM_API as HandlerPriority,
|
|
27
|
+
patterns: [{ pattern: "/internal/agents/list", exact: true, method: "POST" }],
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
constructor(private readonly deps: RuntimeAgentDiscoveryDeps = defaultChannelInvokeDeps) {
|
|
31
|
+
super();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async handle(req: dntShim.Request, ctx: HandlerContext): Promise<HandlerResult> {
|
|
35
|
+
if (!this.shouldHandle(req, ctx)) {
|
|
36
|
+
return this.continue();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return this.withProxyContext(ctx, async () => {
|
|
40
|
+
const builder = this.createResponseBuilder(ctx)
|
|
41
|
+
.withCORS(req, ctx.securityConfig?.cors)
|
|
42
|
+
.withSecurity(ctx.securityConfig ?? undefined, req);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const rawBody = await readInternalAgentRequestBody(
|
|
46
|
+
req,
|
|
47
|
+
INTERNAL_AGENT_CONTROL_PLANE_MAX_BODY_BYTES,
|
|
48
|
+
);
|
|
49
|
+
const payload: ControlPlaneAgentsListRequest = ControlPlaneAgentsListRequestSchema.parse(
|
|
50
|
+
JSON.parse(rawBody),
|
|
51
|
+
);
|
|
52
|
+
const claims = await verifyControlPlaneRequest(req, ctx, rawBody, {
|
|
53
|
+
expectedSubject: payload.requestId,
|
|
54
|
+
expectedSurface: payload.surface,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
if (
|
|
58
|
+
payload.projectId !== claims.project_id ||
|
|
59
|
+
(ctx.projectId !== undefined && payload.projectId !== ctx.projectId)
|
|
60
|
+
) {
|
|
61
|
+
this.logWarn("Internal agents list request body did not match signed claims", {
|
|
62
|
+
projectSlug: ctx.projectSlug,
|
|
63
|
+
projectId: ctx.projectId,
|
|
64
|
+
requestId: payload.requestId,
|
|
65
|
+
signedRequestId: claims.sub,
|
|
66
|
+
surface: payload.surface,
|
|
67
|
+
signedSurface: claims.surface,
|
|
68
|
+
});
|
|
69
|
+
return this.respond(builder.json({ error: "Invalid control-plane signature" }, 401));
|
|
70
|
+
}
|
|
71
|
+
const response = await listRuntimeAgents(ctx, this.deps);
|
|
72
|
+
return this.respond(builder.json(response, 200));
|
|
73
|
+
} catch (error) {
|
|
74
|
+
if (error instanceof InternalAgentRequestBodyTooLargeError) {
|
|
75
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (error instanceof ControlPlaneRequestError) {
|
|
79
|
+
this.logWarn("Internal agents list signature verification failed", {
|
|
80
|
+
error: error.message,
|
|
81
|
+
projectSlug: ctx.projectSlug,
|
|
82
|
+
projectId: ctx.projectId,
|
|
83
|
+
});
|
|
84
|
+
return this.respond(builder.json({ error: error.message }, error.status));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (error instanceof SyntaxError || error instanceof ZodError) {
|
|
88
|
+
this.logWarn("Internal agents list request validation failed", {
|
|
89
|
+
error: error instanceof Error ? error.message : String(error),
|
|
90
|
+
projectSlug: ctx.projectSlug,
|
|
91
|
+
projectId: ctx.projectId,
|
|
92
|
+
});
|
|
93
|
+
return this.respond(builder.json({ error: "Invalid internal agents request" }, 400));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -53,6 +53,10 @@ import { HMRHandler } from "../handlers/preview/hmr.handler.js";
|
|
|
53
53
|
import { MarkdownPreviewHandler } from "../handlers/preview/markdown-preview.handler.js";
|
|
54
54
|
import { OpenAPIHandler } from "../handlers/request/openapi.handler.js";
|
|
55
55
|
import { OpenAPIDocsHandler } from "../handlers/request/openapi-docs.handler.js";
|
|
56
|
+
import { InternalAgentsListHandler } from "../handlers/request/internal-agents-list.handler.js";
|
|
57
|
+
import { AgentStreamHandler } from "../handlers/request/agent-stream.handler.js";
|
|
58
|
+
import { AgentRunResumeHandler } from "../handlers/request/agent-run-resume.handler.js";
|
|
59
|
+
import { AgentRunCancelHandler } from "../handlers/request/agent-run-cancel.handler.js";
|
|
56
60
|
import { ChannelInvokeHandler } from "../handlers/request/channel-invoke.handler.js";
|
|
57
61
|
import { DevDashboardHandler } from "../handlers/dev/dashboard/index.js";
|
|
58
62
|
import { ProjectsHandler } from "../handlers/dev/projects/index.js";
|
|
@@ -205,6 +209,10 @@ export function createVeryfrontHandler(
|
|
|
205
209
|
new DebugContextHandler(),
|
|
206
210
|
new OpenAPIHandler(),
|
|
207
211
|
new OpenAPIDocsHandler(),
|
|
212
|
+
new InternalAgentsListHandler(),
|
|
213
|
+
new AgentStreamHandler(),
|
|
214
|
+
new AgentRunResumeHandler(),
|
|
215
|
+
new AgentRunCancelHandler(),
|
|
208
216
|
new ChannelInvokeHandler(),
|
|
209
217
|
new DevDashboardHandler(),
|
|
210
218
|
new ProjectsHandler(),
|