@voltagent/serverless-hono 1.0.1
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/LICENCE +21 -0
- package/README.md +23 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.js +669 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/LICENCE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 VoltAgent Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# @voltagent/serverless-hono
|
|
2
|
+
|
|
3
|
+
Serverless (fetch-based) runtime provider for VoltAgent using the [Hono](https://hono.dev) framework. This package exposes a `serverless` factory that plugs into `VoltAgent` so you can deploy agents to Cloudflare Workers, Vercel Edge Functions, Deno Deploy, or Netlify Functions with minimal boilerplate.
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
import { VoltAgent } from "@voltagent/core";
|
|
7
|
+
import { serverlessHono } from "@voltagent/serverless-hono";
|
|
8
|
+
|
|
9
|
+
const voltAgent = new VoltAgent({
|
|
10
|
+
agents: {
|
|
11
|
+
/* ... */
|
|
12
|
+
},
|
|
13
|
+
serverless: serverlessHono({ corsOrigin: "*" }),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export default voltAgent.serverless().toCloudflareWorker();
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Build
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm --filter @voltagent/serverless-hono build
|
|
23
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ServerProviderDeps, IServerlessProvider, VoltAgent } from '@voltagent/core';
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
|
|
4
|
+
type ServerlessRuntime = "cloudflare" | "vercel" | "deno" | "unknown";
|
|
5
|
+
interface ServerlessConfig {
|
|
6
|
+
corsOrigin?: string | string[];
|
|
7
|
+
corsAllowMethods?: string[];
|
|
8
|
+
corsAllowHeaders?: string[];
|
|
9
|
+
maxRequestSize?: number;
|
|
10
|
+
configureApp?: (app: Hono, deps: ServerProviderDeps) => void | Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare class HonoServerlessProvider implements IServerlessProvider {
|
|
14
|
+
private readonly deps;
|
|
15
|
+
private readonly config?;
|
|
16
|
+
private readonly appPromise;
|
|
17
|
+
constructor(deps: ServerProviderDeps, config?: ServerlessConfig);
|
|
18
|
+
private initializeApp;
|
|
19
|
+
private getApp;
|
|
20
|
+
private ensureEnvironmentTarget;
|
|
21
|
+
handleRequest(request: Request): Promise<Response>;
|
|
22
|
+
toCloudflareWorker(): {
|
|
23
|
+
fetch: (request: Request, env: Record<string, unknown>, executionCtx: unknown) => Promise<Response>;
|
|
24
|
+
};
|
|
25
|
+
toVercelEdge(): (request: Request, context?: unknown) => Promise<Response>;
|
|
26
|
+
toDeno(): (request: Request, info?: unknown) => Promise<Response>;
|
|
27
|
+
auto(): {
|
|
28
|
+
fetch: (req: Request, env: Record<string, unknown>, ctx: unknown) => Promise<Response>;
|
|
29
|
+
} | ((req: Request, ctx?: unknown) => Promise<Response>);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
declare function detectServerlessRuntime(): ServerlessRuntime;
|
|
33
|
+
|
|
34
|
+
interface NetlifyFunctionEvent {
|
|
35
|
+
httpMethod?: string;
|
|
36
|
+
headers?: Record<string, string | undefined>;
|
|
37
|
+
multiValueHeaders?: Record<string, (string | undefined)[] | undefined>;
|
|
38
|
+
rawUrl?: string;
|
|
39
|
+
rawQuery?: string;
|
|
40
|
+
rawPath?: string;
|
|
41
|
+
path?: string;
|
|
42
|
+
body?: string | null;
|
|
43
|
+
isBase64Encoded?: boolean;
|
|
44
|
+
}
|
|
45
|
+
interface NetlifyFunctionResult {
|
|
46
|
+
statusCode: number;
|
|
47
|
+
headers?: Record<string, string>;
|
|
48
|
+
multiValueHeaders?: Record<string, string[]>;
|
|
49
|
+
body: string;
|
|
50
|
+
isBase64Encoded: boolean;
|
|
51
|
+
}
|
|
52
|
+
type NetlifyFunctionHandler = (event: NetlifyFunctionEvent, context: unknown) => Promise<NetlifyFunctionResult>;
|
|
53
|
+
declare function createNetlifyFunctionHandler(voltAgent: VoltAgent): NetlifyFunctionHandler;
|
|
54
|
+
|
|
55
|
+
declare function serverlessHono(config?: ServerlessConfig): (deps: ServerProviderDeps) => HonoServerlessProvider;
|
|
56
|
+
|
|
57
|
+
export { HonoServerlessProvider, type NetlifyFunctionEvent, type NetlifyFunctionHandler, type NetlifyFunctionResult, type ServerlessConfig, type ServerlessRuntime, createNetlifyFunctionHandler, serverlessHono as default, detectServerlessRuntime, serverlessHono };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,669 @@
|
|
|
1
|
+
// src/app-factory.ts
|
|
2
|
+
import { getOrCreateLogger } from "@voltagent/server-core";
|
|
3
|
+
import { Hono } from "hono";
|
|
4
|
+
import { cors } from "hono/cors";
|
|
5
|
+
|
|
6
|
+
// src/routes.ts
|
|
7
|
+
import { safeStringify } from "@voltagent/internal";
|
|
8
|
+
import {
|
|
9
|
+
getLogsBySpanIdHandler,
|
|
10
|
+
getLogsByTraceIdHandler,
|
|
11
|
+
getObservabilityStatusHandler,
|
|
12
|
+
getSpanByIdHandler,
|
|
13
|
+
getTraceByIdHandler,
|
|
14
|
+
getTracesHandler,
|
|
15
|
+
queryLogsHandler
|
|
16
|
+
} from "@voltagent/server-core";
|
|
17
|
+
import {
|
|
18
|
+
A2A_ROUTES,
|
|
19
|
+
AGENT_ROUTES,
|
|
20
|
+
OBSERVABILITY_ROUTES,
|
|
21
|
+
WORKFLOW_ROUTES,
|
|
22
|
+
executeA2ARequest,
|
|
23
|
+
handleChatStream,
|
|
24
|
+
handleExecuteWorkflow,
|
|
25
|
+
handleGenerateObject,
|
|
26
|
+
handleGenerateText,
|
|
27
|
+
handleGetAgent,
|
|
28
|
+
handleGetAgentHistory,
|
|
29
|
+
handleGetAgents,
|
|
30
|
+
handleGetLogs,
|
|
31
|
+
handleGetWorkflow,
|
|
32
|
+
handleGetWorkflowState,
|
|
33
|
+
handleGetWorkflows,
|
|
34
|
+
handleResumeWorkflow,
|
|
35
|
+
handleStreamObject,
|
|
36
|
+
handleStreamText,
|
|
37
|
+
handleStreamWorkflow,
|
|
38
|
+
handleSuspendWorkflow,
|
|
39
|
+
isErrorResponse,
|
|
40
|
+
mapLogResponse,
|
|
41
|
+
parseJsonRpcRequest,
|
|
42
|
+
resolveAgentCard
|
|
43
|
+
} from "@voltagent/server-core";
|
|
44
|
+
function parseJsonSafe(raw, logger) {
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(raw);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logger.warn("Failed to parse JSON payload", { error });
|
|
49
|
+
return void 0;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function readJsonBody(c, logger) {
|
|
53
|
+
try {
|
|
54
|
+
return await c.req.json();
|
|
55
|
+
} catch (error) {
|
|
56
|
+
logger.warn("Invalid JSON body received", { error, path: c.req.path });
|
|
57
|
+
return void 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function parseContextCandidate(candidate) {
|
|
61
|
+
if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) {
|
|
62
|
+
return void 0;
|
|
63
|
+
}
|
|
64
|
+
const { userId, sessionId, metadata } = candidate;
|
|
65
|
+
const context = {};
|
|
66
|
+
if (typeof userId === "string") {
|
|
67
|
+
context.userId = userId;
|
|
68
|
+
}
|
|
69
|
+
if (typeof sessionId === "string") {
|
|
70
|
+
context.sessionId = sessionId;
|
|
71
|
+
}
|
|
72
|
+
if (metadata && typeof metadata === "object" && !Array.isArray(metadata)) {
|
|
73
|
+
context.metadata = metadata;
|
|
74
|
+
}
|
|
75
|
+
return Object.keys(context).length > 0 ? context : void 0;
|
|
76
|
+
}
|
|
77
|
+
function mergeContexts(base, next) {
|
|
78
|
+
if (!base) {
|
|
79
|
+
return next;
|
|
80
|
+
}
|
|
81
|
+
if (!next) {
|
|
82
|
+
return base;
|
|
83
|
+
}
|
|
84
|
+
const merged = {
|
|
85
|
+
...base,
|
|
86
|
+
...next
|
|
87
|
+
};
|
|
88
|
+
if (base.metadata || next.metadata) {
|
|
89
|
+
merged.metadata = {
|
|
90
|
+
...base.metadata ?? {},
|
|
91
|
+
...next.metadata ?? {}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return merged;
|
|
95
|
+
}
|
|
96
|
+
function registerAgentRoutes(app, deps, logger) {
|
|
97
|
+
app.get(AGENT_ROUTES.listAgents.path, async (c) => {
|
|
98
|
+
const response = await handleGetAgents(deps, logger);
|
|
99
|
+
return c.json(response, response.success ? 200 : 500);
|
|
100
|
+
});
|
|
101
|
+
app.get(AGENT_ROUTES.getAgent.path, async (c) => {
|
|
102
|
+
const agentId = c.req.param("id");
|
|
103
|
+
const response = await handleGetAgent(agentId, deps, logger);
|
|
104
|
+
return c.json(response, response.success ? 200 : 500);
|
|
105
|
+
});
|
|
106
|
+
app.post(AGENT_ROUTES.generateText.path, async (c) => {
|
|
107
|
+
const agentId = c.req.param("id");
|
|
108
|
+
const body = await readJsonBody(c, logger);
|
|
109
|
+
if (!body) {
|
|
110
|
+
return c.json({ success: false, error: "Invalid JSON body" }, 400);
|
|
111
|
+
}
|
|
112
|
+
const signal = c.req.raw.signal;
|
|
113
|
+
const response = await handleGenerateText(agentId, body, deps, logger, signal);
|
|
114
|
+
return c.json(response, response.success ? 200 : 500);
|
|
115
|
+
});
|
|
116
|
+
app.post(AGENT_ROUTES.streamText.path, async (c) => {
|
|
117
|
+
const agentId = c.req.param("id");
|
|
118
|
+
const body = await readJsonBody(c, logger);
|
|
119
|
+
if (!body) {
|
|
120
|
+
return c.json({ error: "Invalid JSON body" }, 400);
|
|
121
|
+
}
|
|
122
|
+
const signal = c.req.raw.signal;
|
|
123
|
+
const response = await handleStreamText(agentId, body, deps, logger, signal);
|
|
124
|
+
return response;
|
|
125
|
+
});
|
|
126
|
+
app.post(AGENT_ROUTES.chatStream.path, async (c) => {
|
|
127
|
+
const agentId = c.req.param("id");
|
|
128
|
+
const body = await readJsonBody(c, logger);
|
|
129
|
+
if (!body) {
|
|
130
|
+
return c.json({ error: "Invalid JSON body" }, 400);
|
|
131
|
+
}
|
|
132
|
+
const signal = c.req.raw.signal;
|
|
133
|
+
return handleChatStream(agentId, body, deps, logger, signal);
|
|
134
|
+
});
|
|
135
|
+
app.post(AGENT_ROUTES.generateObject.path, async (c) => {
|
|
136
|
+
const agentId = c.req.param("id");
|
|
137
|
+
const body = await readJsonBody(c, logger);
|
|
138
|
+
if (!body) {
|
|
139
|
+
return c.json({ success: false, error: "Invalid JSON body" }, 400);
|
|
140
|
+
}
|
|
141
|
+
const signal = c.req.raw.signal;
|
|
142
|
+
const response = await handleGenerateObject(agentId, body, deps, logger, signal);
|
|
143
|
+
return c.json(response, response.success ? 200 : 500);
|
|
144
|
+
});
|
|
145
|
+
app.post(AGENT_ROUTES.streamObject.path, async (c) => {
|
|
146
|
+
const agentId = c.req.param("id");
|
|
147
|
+
const body = await readJsonBody(c, logger);
|
|
148
|
+
if (!body) {
|
|
149
|
+
return c.json({ error: "Invalid JSON body" }, 400);
|
|
150
|
+
}
|
|
151
|
+
const signal = c.req.raw.signal;
|
|
152
|
+
return handleStreamObject(agentId, body, deps, logger, signal);
|
|
153
|
+
});
|
|
154
|
+
app.get(AGENT_ROUTES.getAgentHistory.path, async (c) => {
|
|
155
|
+
const agentId = c.req.param("id");
|
|
156
|
+
const page = Number.parseInt(c.req.query("page") || "0", 10);
|
|
157
|
+
const limit = Number.parseInt(c.req.query("limit") || "10", 10);
|
|
158
|
+
const response = await handleGetAgentHistory(agentId, page, limit, deps, logger);
|
|
159
|
+
return c.json(response, response.success ? 200 : 500);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
function registerWorkflowRoutes(app, deps, logger) {
|
|
163
|
+
app.get(WORKFLOW_ROUTES.listWorkflows.path, async (c) => {
|
|
164
|
+
const response = await handleGetWorkflows(deps, logger);
|
|
165
|
+
return c.json(response, response.success ? 200 : 500);
|
|
166
|
+
});
|
|
167
|
+
app.get(WORKFLOW_ROUTES.getWorkflow.path, async (c) => {
|
|
168
|
+
const workflowId = c.req.param("id");
|
|
169
|
+
const response = await handleGetWorkflow(workflowId, deps, logger);
|
|
170
|
+
return c.json(response, response.success ? 200 : 500);
|
|
171
|
+
});
|
|
172
|
+
app.post(WORKFLOW_ROUTES.executeWorkflow.path, async (c) => {
|
|
173
|
+
const workflowId = c.req.param("id");
|
|
174
|
+
const body = await readJsonBody(c, logger);
|
|
175
|
+
if (!body) {
|
|
176
|
+
return c.json({ success: false, error: "Invalid JSON body" }, 400);
|
|
177
|
+
}
|
|
178
|
+
const response = await handleExecuteWorkflow(workflowId, body, deps, logger);
|
|
179
|
+
return c.json(response, response.success ? 200 : 500);
|
|
180
|
+
});
|
|
181
|
+
app.post(WORKFLOW_ROUTES.streamWorkflow.path, async (c) => {
|
|
182
|
+
const workflowId = c.req.param("id");
|
|
183
|
+
const body = await readJsonBody(c, logger);
|
|
184
|
+
if (!body) {
|
|
185
|
+
return c.json({ error: "Invalid JSON body" }, 400);
|
|
186
|
+
}
|
|
187
|
+
const response = await handleStreamWorkflow(workflowId, body, deps, logger);
|
|
188
|
+
if (isErrorResponse(response)) {
|
|
189
|
+
return c.json(response, 500);
|
|
190
|
+
}
|
|
191
|
+
return c.body(response, 200, {
|
|
192
|
+
"Content-Type": "text/event-stream",
|
|
193
|
+
"Cache-Control": "no-cache",
|
|
194
|
+
Connection: "keep-alive"
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
app.post(WORKFLOW_ROUTES.suspendWorkflow.path, async (c) => {
|
|
198
|
+
const executionId = c.req.param("executionId");
|
|
199
|
+
const body = await readJsonBody(c, logger);
|
|
200
|
+
if (!body) {
|
|
201
|
+
return c.json({ success: false, error: "Invalid JSON body" }, 400);
|
|
202
|
+
}
|
|
203
|
+
const response = await handleSuspendWorkflow(executionId, body, deps, logger);
|
|
204
|
+
return c.json(response, response.success ? 200 : 500);
|
|
205
|
+
});
|
|
206
|
+
app.post(WORKFLOW_ROUTES.resumeWorkflow.path, async (c) => {
|
|
207
|
+
const workflowId = c.req.param("id");
|
|
208
|
+
const executionId = c.req.param("executionId");
|
|
209
|
+
const body = await readJsonBody(c, logger);
|
|
210
|
+
if (!body) {
|
|
211
|
+
return c.json({ success: false, error: "Invalid JSON body" }, 400);
|
|
212
|
+
}
|
|
213
|
+
const response = await handleResumeWorkflow(workflowId, executionId, body, deps, logger);
|
|
214
|
+
return c.json(response, response.success ? 200 : 500);
|
|
215
|
+
});
|
|
216
|
+
app.get(WORKFLOW_ROUTES.getWorkflowState.path, async (c) => {
|
|
217
|
+
const workflowId = c.req.param("id");
|
|
218
|
+
const executionId = c.req.param("executionId");
|
|
219
|
+
const response = await handleGetWorkflowState(workflowId, executionId, deps, logger);
|
|
220
|
+
const status = response.success ? 200 : response.error?.includes("not found") ? 404 : 500;
|
|
221
|
+
return c.json(response, status);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function registerLogRoutes(app, deps, logger) {
|
|
225
|
+
app.get("/logs", async (c) => {
|
|
226
|
+
const query = c.req.query();
|
|
227
|
+
const options = {
|
|
228
|
+
limit: query.limit ? Number(query.limit) : void 0,
|
|
229
|
+
level: query.level,
|
|
230
|
+
agentId: query.agentId,
|
|
231
|
+
workflowId: query.workflowId,
|
|
232
|
+
conversationId: query.conversationId,
|
|
233
|
+
executionId: query.executionId,
|
|
234
|
+
since: query.since,
|
|
235
|
+
until: query.until
|
|
236
|
+
};
|
|
237
|
+
const response = await handleGetLogs(options, deps, logger);
|
|
238
|
+
if (!response.success) {
|
|
239
|
+
return c.json(response, 500);
|
|
240
|
+
}
|
|
241
|
+
const mapped = mapLogResponse(response);
|
|
242
|
+
return c.json(mapped, 200);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
function registerObservabilityRoutes(app, deps, logger) {
|
|
246
|
+
app.post(
|
|
247
|
+
OBSERVABILITY_ROUTES.setupObservability.path,
|
|
248
|
+
(c) => c.json(
|
|
249
|
+
{
|
|
250
|
+
success: false,
|
|
251
|
+
error: "Observability setup is not available in the serverless runtime."
|
|
252
|
+
},
|
|
253
|
+
501
|
|
254
|
+
)
|
|
255
|
+
);
|
|
256
|
+
app.get(OBSERVABILITY_ROUTES.getTraces.path, async (c) => {
|
|
257
|
+
const query = c.req.query();
|
|
258
|
+
logger.debug("[serverless] GET /observability/traces", { query });
|
|
259
|
+
const result = await getTracesHandler(deps, query);
|
|
260
|
+
return c.json(result, result.success ? 200 : 500);
|
|
261
|
+
});
|
|
262
|
+
app.get(OBSERVABILITY_ROUTES.getTraceById.path, async (c) => {
|
|
263
|
+
const traceId = c.req.param("traceId");
|
|
264
|
+
logger.debug("[serverless] GET /observability/traces/:traceId", { traceId });
|
|
265
|
+
const result = await getTraceByIdHandler(traceId, deps);
|
|
266
|
+
return c.json(result, result.success ? 200 : 404);
|
|
267
|
+
});
|
|
268
|
+
app.get(OBSERVABILITY_ROUTES.getSpanById.path, async (c) => {
|
|
269
|
+
const spanId = c.req.param("spanId");
|
|
270
|
+
logger.debug("[serverless] GET /observability/spans/:spanId", { spanId });
|
|
271
|
+
const result = await getSpanByIdHandler(spanId, deps);
|
|
272
|
+
return c.json(result, result.success ? 200 : 404);
|
|
273
|
+
});
|
|
274
|
+
app.get(OBSERVABILITY_ROUTES.getObservabilityStatus.path, async (c) => {
|
|
275
|
+
logger.debug("[serverless] GET /observability/status");
|
|
276
|
+
const result = await getObservabilityStatusHandler(deps);
|
|
277
|
+
return c.json(result, result.success ? 200 : 500);
|
|
278
|
+
});
|
|
279
|
+
app.get(OBSERVABILITY_ROUTES.getLogsByTraceId.path, async (c) => {
|
|
280
|
+
const traceId = c.req.param("traceId");
|
|
281
|
+
logger.debug("[serverless] GET /observability/traces/:traceId/logs", { traceId });
|
|
282
|
+
const result = await getLogsByTraceIdHandler(traceId, deps);
|
|
283
|
+
return c.json(result, result.success ? 200 : 404);
|
|
284
|
+
});
|
|
285
|
+
app.get(OBSERVABILITY_ROUTES.getLogsBySpanId.path, async (c) => {
|
|
286
|
+
const spanId = c.req.param("spanId");
|
|
287
|
+
logger.debug("[serverless] GET /observability/spans/:spanId/logs", { spanId });
|
|
288
|
+
const result = await getLogsBySpanIdHandler(spanId, deps);
|
|
289
|
+
return c.json(result, result.success ? 200 : 404);
|
|
290
|
+
});
|
|
291
|
+
app.get(OBSERVABILITY_ROUTES.queryLogs.path, async (c) => {
|
|
292
|
+
const query = c.req.query();
|
|
293
|
+
logger.debug("[serverless] GET /observability/logs", { query });
|
|
294
|
+
const result = await queryLogsHandler(query, deps);
|
|
295
|
+
return c.json(result, result.success ? 200 : 400);
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
function registerA2ARoutes(app, deps, logger) {
|
|
299
|
+
const registry = deps.a2a?.registry;
|
|
300
|
+
if (!registry) {
|
|
301
|
+
logger.debug("A2A server registry not available on server deps; skipping A2A routes");
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
app.get(A2A_ROUTES.agentCard.path, (c) => {
|
|
305
|
+
const serverId = c.req.param("serverId");
|
|
306
|
+
if (!serverId) {
|
|
307
|
+
return c.json({ success: false, error: "Missing serverId parameter" }, 400);
|
|
308
|
+
}
|
|
309
|
+
try {
|
|
310
|
+
const card = resolveAgentCard(registry, serverId, serverId, {});
|
|
311
|
+
return c.json(card, 200);
|
|
312
|
+
} catch (error) {
|
|
313
|
+
const status = error instanceof Error && error.message.includes("not found") ? 404 : 400;
|
|
314
|
+
return c.json(
|
|
315
|
+
{ success: false, error: error instanceof Error ? error.message : String(error) },
|
|
316
|
+
status
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
app.post(A2A_ROUTES.jsonRpc.path, async (c) => {
|
|
321
|
+
const serverId = c.req.param("serverId");
|
|
322
|
+
if (!serverId) {
|
|
323
|
+
return c.json(
|
|
324
|
+
{ jsonrpc: "2.0", error: { code: -32600, message: "Missing serverId" }, id: null },
|
|
325
|
+
400
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
let request;
|
|
329
|
+
let context;
|
|
330
|
+
try {
|
|
331
|
+
const queryContext = c.req.query("context") ?? c.req.query("runtimeContext");
|
|
332
|
+
if (queryContext) {
|
|
333
|
+
const parsedQueryContext = parseJsonSafe(queryContext, logger);
|
|
334
|
+
context = mergeContexts(context, parseContextCandidate(parsedQueryContext));
|
|
335
|
+
}
|
|
336
|
+
const body = await readJsonBody(
|
|
337
|
+
c,
|
|
338
|
+
logger
|
|
339
|
+
);
|
|
340
|
+
if (!body) {
|
|
341
|
+
return c.json(
|
|
342
|
+
{ jsonrpc: "2.0", error: { code: -32600, message: "Invalid request" }, id: null },
|
|
343
|
+
400
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
if (typeof body.context !== "undefined") {
|
|
347
|
+
const { context: bodyContext, ...rest } = body;
|
|
348
|
+
context = mergeContexts(context, parseContextCandidate(bodyContext));
|
|
349
|
+
request = parseJsonRpcRequest(rest);
|
|
350
|
+
} else {
|
|
351
|
+
request = parseJsonRpcRequest(body);
|
|
352
|
+
}
|
|
353
|
+
} catch (error) {
|
|
354
|
+
return c.json(
|
|
355
|
+
{ jsonrpc: "2.0", error: { code: -32600, message: String(error) }, id: null },
|
|
356
|
+
400
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
const response = await executeA2ARequest({
|
|
360
|
+
registry,
|
|
361
|
+
serverId,
|
|
362
|
+
request,
|
|
363
|
+
context,
|
|
364
|
+
logger
|
|
365
|
+
});
|
|
366
|
+
if ("kind" in response && response.kind === "stream") {
|
|
367
|
+
const { stream, id } = response;
|
|
368
|
+
const encoder = new TextEncoder();
|
|
369
|
+
const abortSignal = c.req.raw.signal;
|
|
370
|
+
let abortListener;
|
|
371
|
+
let cleanedUp = false;
|
|
372
|
+
const cleanup = async () => {
|
|
373
|
+
if (abortSignal && abortListener) {
|
|
374
|
+
abortSignal.removeEventListener("abort", abortListener);
|
|
375
|
+
abortListener = void 0;
|
|
376
|
+
}
|
|
377
|
+
if (!cleanedUp && typeof stream.return === "function") {
|
|
378
|
+
cleanedUp = true;
|
|
379
|
+
try {
|
|
380
|
+
await stream.return(void 0);
|
|
381
|
+
} catch {
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
const sseStream = new ReadableStream({
|
|
386
|
+
async start(controller) {
|
|
387
|
+
if (abortSignal) {
|
|
388
|
+
if (abortSignal.aborted) {
|
|
389
|
+
await cleanup();
|
|
390
|
+
controller.close();
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
abortListener = () => {
|
|
394
|
+
controller.close();
|
|
395
|
+
void cleanup();
|
|
396
|
+
};
|
|
397
|
+
abortSignal.addEventListener("abort", abortListener, { once: true });
|
|
398
|
+
}
|
|
399
|
+
try {
|
|
400
|
+
for await (const chunk of stream) {
|
|
401
|
+
const payload = safeStringify(chunk);
|
|
402
|
+
controller.enqueue(encoder.encode(`data: ${payload}
|
|
403
|
+
|
|
404
|
+
`));
|
|
405
|
+
}
|
|
406
|
+
} catch (error) {
|
|
407
|
+
const payload = safeStringify({
|
|
408
|
+
jsonrpc: "2.0",
|
|
409
|
+
error: { code: -32603, message: String(error) },
|
|
410
|
+
id
|
|
411
|
+
});
|
|
412
|
+
controller.enqueue(encoder.encode(`data: ${payload}
|
|
413
|
+
|
|
414
|
+
`));
|
|
415
|
+
} finally {
|
|
416
|
+
await cleanup();
|
|
417
|
+
controller.close();
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
async cancel() {
|
|
421
|
+
await cleanup();
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
return new Response(sseStream, {
|
|
425
|
+
status: 200,
|
|
426
|
+
headers: {
|
|
427
|
+
"Content-Type": "text/event-stream",
|
|
428
|
+
"Cache-Control": "no-cache",
|
|
429
|
+
Connection: "keep-alive",
|
|
430
|
+
"X-Accel-Buffering": "no"
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
const jsonResponse = response;
|
|
435
|
+
return c.json(jsonResponse, jsonResponse.error ? 400 : 200);
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// src/app-factory.ts
|
|
440
|
+
function resolveCorsConfig(config) {
|
|
441
|
+
const origin = config?.corsOrigin ?? "*";
|
|
442
|
+
const allowMethods = config?.corsAllowMethods ?? [
|
|
443
|
+
"GET",
|
|
444
|
+
"POST",
|
|
445
|
+
"PUT",
|
|
446
|
+
"PATCH",
|
|
447
|
+
"DELETE",
|
|
448
|
+
"OPTIONS"
|
|
449
|
+
];
|
|
450
|
+
const allowHeaders = config?.corsAllowHeaders ?? ["Content-Type", "Authorization"];
|
|
451
|
+
return {
|
|
452
|
+
origin,
|
|
453
|
+
allowMethods,
|
|
454
|
+
allowHeaders
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
async function createServerlessApp(deps, config) {
|
|
458
|
+
const app = new Hono();
|
|
459
|
+
const logger = getOrCreateLogger(deps, "serverless");
|
|
460
|
+
const corsConfig = resolveCorsConfig(config);
|
|
461
|
+
app.use("*", cors(corsConfig));
|
|
462
|
+
app.get(
|
|
463
|
+
"/",
|
|
464
|
+
(c) => c.json({
|
|
465
|
+
name: "VoltAgent Serverless",
|
|
466
|
+
message: "VoltAgent serverless runtime is running"
|
|
467
|
+
})
|
|
468
|
+
);
|
|
469
|
+
app.get(
|
|
470
|
+
"/ws",
|
|
471
|
+
(c) => c.json(
|
|
472
|
+
{
|
|
473
|
+
success: false,
|
|
474
|
+
error: "WebSocket streaming is not implemented in the serverless runtime yet. Falling back to HTTP polling."
|
|
475
|
+
},
|
|
476
|
+
200
|
|
477
|
+
)
|
|
478
|
+
);
|
|
479
|
+
registerAgentRoutes(app, deps, logger);
|
|
480
|
+
registerWorkflowRoutes(app, deps, logger);
|
|
481
|
+
registerLogRoutes(app, deps, logger);
|
|
482
|
+
registerObservabilityRoutes(app, deps, logger);
|
|
483
|
+
registerA2ARoutes(app, deps, logger);
|
|
484
|
+
if (config?.configureApp) {
|
|
485
|
+
await config.configureApp(app, deps);
|
|
486
|
+
}
|
|
487
|
+
return app;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// src/utils/runtime-detection.ts
|
|
491
|
+
function detectServerlessRuntime() {
|
|
492
|
+
if (typeof globalThis.Deno !== "undefined") {
|
|
493
|
+
return "deno";
|
|
494
|
+
}
|
|
495
|
+
if (typeof globalThis.EdgeRuntime !== "undefined") {
|
|
496
|
+
return "vercel";
|
|
497
|
+
}
|
|
498
|
+
if (globalThis.navigator?.userAgent?.includes("Cloudflare")) {
|
|
499
|
+
return "cloudflare";
|
|
500
|
+
}
|
|
501
|
+
return "unknown";
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// src/serverless-provider.ts
|
|
505
|
+
var HonoServerlessProvider = class {
|
|
506
|
+
deps;
|
|
507
|
+
config;
|
|
508
|
+
appPromise;
|
|
509
|
+
constructor(deps, config) {
|
|
510
|
+
this.deps = deps;
|
|
511
|
+
this.config = config;
|
|
512
|
+
this.appPromise = this.initializeApp();
|
|
513
|
+
}
|
|
514
|
+
async initializeApp() {
|
|
515
|
+
return createServerlessApp(this.deps, this.config);
|
|
516
|
+
}
|
|
517
|
+
async getApp() {
|
|
518
|
+
return this.appPromise;
|
|
519
|
+
}
|
|
520
|
+
async ensureEnvironmentTarget(target) {
|
|
521
|
+
if (this.deps.ensureEnvironment) {
|
|
522
|
+
await Promise.resolve(this.deps.ensureEnvironment(target));
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
async handleRequest(request) {
|
|
526
|
+
await this.ensureEnvironmentTarget();
|
|
527
|
+
const app = await this.getApp();
|
|
528
|
+
return app.fetch(request);
|
|
529
|
+
}
|
|
530
|
+
toCloudflareWorker() {
|
|
531
|
+
return {
|
|
532
|
+
fetch: async (request, env, executionCtx) => {
|
|
533
|
+
const waitUntil = executionCtx && typeof executionCtx?.waitUntil === "function" ? executionCtx.waitUntil.bind(executionCtx) : void 0;
|
|
534
|
+
const globals = globalThis;
|
|
535
|
+
const previousWaitUntil = globals.___voltagent_wait_until;
|
|
536
|
+
if (waitUntil) {
|
|
537
|
+
globals.___voltagent_wait_until = (promise) => {
|
|
538
|
+
try {
|
|
539
|
+
waitUntil(promise);
|
|
540
|
+
} catch {
|
|
541
|
+
void promise;
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
try {
|
|
546
|
+
await this.ensureEnvironmentTarget(env);
|
|
547
|
+
const app = await this.getApp();
|
|
548
|
+
return await app.fetch(request, env, executionCtx);
|
|
549
|
+
} finally {
|
|
550
|
+
if (waitUntil) {
|
|
551
|
+
if (previousWaitUntil) {
|
|
552
|
+
globals.___voltagent_wait_until = previousWaitUntil;
|
|
553
|
+
} else {
|
|
554
|
+
globals.___voltagent_wait_until = void 0;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
toVercelEdge() {
|
|
562
|
+
return async (request, context) => {
|
|
563
|
+
await this.ensureEnvironmentTarget(context);
|
|
564
|
+
const app = await this.getApp();
|
|
565
|
+
return app.fetch(request, context);
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
toDeno() {
|
|
569
|
+
return async (request, info) => {
|
|
570
|
+
await this.ensureEnvironmentTarget(info);
|
|
571
|
+
const app = await this.getApp();
|
|
572
|
+
return app.fetch(request, info);
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
auto() {
|
|
576
|
+
const runtime = detectServerlessRuntime();
|
|
577
|
+
switch (runtime) {
|
|
578
|
+
case "cloudflare":
|
|
579
|
+
return this.toCloudflareWorker();
|
|
580
|
+
case "vercel":
|
|
581
|
+
return this.toVercelEdge();
|
|
582
|
+
case "deno":
|
|
583
|
+
return this.toDeno();
|
|
584
|
+
default:
|
|
585
|
+
return this.toCloudflareWorker();
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
// src/netlify-function.ts
|
|
591
|
+
import { Buffer } from "buffer";
|
|
592
|
+
var TEXT_BODY_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD"]);
|
|
593
|
+
function buildUrl(event) {
|
|
594
|
+
const scheme = event.headers?.["x-forwarded-proto"] || "https";
|
|
595
|
+
const host = event.headers?.host || "localhost";
|
|
596
|
+
const path = event.rawPath || event.path || "/";
|
|
597
|
+
const query = event.rawQuery ? `?${event.rawQuery}` : "";
|
|
598
|
+
return `${scheme}://${host}${path}${query}`;
|
|
599
|
+
}
|
|
600
|
+
function createRequest(event) {
|
|
601
|
+
const method = (event.httpMethod || "GET").toUpperCase();
|
|
602
|
+
const headers = new Headers();
|
|
603
|
+
if (event.multiValueHeaders) {
|
|
604
|
+
for (const [key, values] of Object.entries(event.multiValueHeaders)) {
|
|
605
|
+
if (!values) continue;
|
|
606
|
+
for (const value of values) {
|
|
607
|
+
if (value !== void 0) {
|
|
608
|
+
headers.append(key, value);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
if (event.headers) {
|
|
614
|
+
for (const [key, value] of Object.entries(event.headers)) {
|
|
615
|
+
if (value !== void 0) {
|
|
616
|
+
headers.set(key, value);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
const url = event.rawUrl || buildUrl(event);
|
|
621
|
+
const init = { method, headers };
|
|
622
|
+
if (!TEXT_BODY_METHODS.has(method) && event.body) {
|
|
623
|
+
init.body = event.isBase64Encoded ? Buffer.from(event.body, "base64") : event.body;
|
|
624
|
+
}
|
|
625
|
+
return new Request(url, init);
|
|
626
|
+
}
|
|
627
|
+
function toNetlifyResponse(response) {
|
|
628
|
+
const single = {};
|
|
629
|
+
const multi = {};
|
|
630
|
+
response.headers.forEach((value, key) => {
|
|
631
|
+
if (single[key]) {
|
|
632
|
+
multi[key] = [single[key], value];
|
|
633
|
+
delete single[key];
|
|
634
|
+
} else if (multi[key]) {
|
|
635
|
+
multi[key].push(value);
|
|
636
|
+
} else {
|
|
637
|
+
single[key] = value;
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
return response.arrayBuffer().then((buffer) => ({
|
|
641
|
+
statusCode: response.status,
|
|
642
|
+
headers: Object.keys(single).length > 0 ? single : void 0,
|
|
643
|
+
multiValueHeaders: Object.keys(multi).length > 0 ? multi : void 0,
|
|
644
|
+
body: Buffer.from(buffer).toString("base64"),
|
|
645
|
+
isBase64Encoded: true
|
|
646
|
+
}));
|
|
647
|
+
}
|
|
648
|
+
function createNetlifyFunctionHandler(voltAgent) {
|
|
649
|
+
const provider = voltAgent.serverless();
|
|
650
|
+
return async (event) => {
|
|
651
|
+
const request = createRequest(event);
|
|
652
|
+
const response = await provider.handleRequest(request);
|
|
653
|
+
return toNetlifyResponse(response);
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// src/index.ts
|
|
658
|
+
function serverlessHono(config) {
|
|
659
|
+
return (deps) => new HonoServerlessProvider(deps, config);
|
|
660
|
+
}
|
|
661
|
+
var index_default = serverlessHono;
|
|
662
|
+
export {
|
|
663
|
+
HonoServerlessProvider,
|
|
664
|
+
createNetlifyFunctionHandler,
|
|
665
|
+
index_default as default,
|
|
666
|
+
detectServerlessRuntime,
|
|
667
|
+
serverlessHono
|
|
668
|
+
};
|
|
669
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/app-factory.ts","../src/routes.ts","../src/utils/runtime-detection.ts","../src/serverless-provider.ts","../src/netlify-function.ts","../src/index.ts"],"sourcesContent":["import type { ServerProviderDeps } from \"@voltagent/core\";\nimport type { Logger } from \"@voltagent/internal\";\nimport { getOrCreateLogger } from \"@voltagent/server-core\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport {\n registerA2ARoutes,\n registerAgentRoutes,\n registerLogRoutes,\n registerObservabilityRoutes,\n registerWorkflowRoutes,\n} from \"./routes\";\nimport type { ServerlessConfig } from \"./types\";\n\nfunction resolveCorsConfig(config?: ServerlessConfig) {\n const origin = config?.corsOrigin ?? \"*\";\n const allowMethods = config?.corsAllowMethods ?? [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n ];\n const allowHeaders = config?.corsAllowHeaders ?? [\"Content-Type\", \"Authorization\"];\n\n return {\n origin,\n allowMethods,\n allowHeaders,\n };\n}\n\nexport async function createServerlessApp(deps: ServerProviderDeps, config?: ServerlessConfig) {\n const app = new Hono();\n const logger: Logger = getOrCreateLogger(deps, \"serverless\");\n\n const corsConfig = resolveCorsConfig(config);\n app.use(\"*\", cors(corsConfig));\n\n app.get(\"/\", (c) =>\n c.json({\n name: \"VoltAgent Serverless\",\n message: \"VoltAgent serverless runtime is running\",\n }),\n );\n\n // Provide a friendly response for WebSocket probes (Console UI polls /ws)\n app.get(\"/ws\", (c) =>\n c.json(\n {\n success: false,\n error:\n \"WebSocket streaming is not implemented in the serverless runtime yet. Falling back to HTTP polling.\",\n },\n 200,\n ),\n );\n\n registerAgentRoutes(app, deps, logger);\n registerWorkflowRoutes(app, deps, logger);\n registerLogRoutes(app, deps, logger);\n registerObservabilityRoutes(app, deps, logger);\n registerA2ARoutes(app, deps, logger);\n\n if (config?.configureApp) {\n await config.configureApp(app, deps);\n }\n\n return app;\n}\n","import type { A2AServerRegistry, ServerProviderDeps } from \"@voltagent/core\";\nimport type { Logger } from \"@voltagent/internal\";\nimport { safeStringify } from \"@voltagent/internal\";\nimport {\n getLogsBySpanIdHandler,\n getLogsByTraceIdHandler,\n getObservabilityStatusHandler,\n getSpanByIdHandler,\n getTraceByIdHandler,\n getTracesHandler,\n queryLogsHandler,\n} from \"@voltagent/server-core\";\nimport type {\n A2AServerLikeWithHandlers,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"@voltagent/server-core\";\nimport {\n type A2ARequestContext,\n A2A_ROUTES,\n AGENT_ROUTES,\n OBSERVABILITY_ROUTES,\n WORKFLOW_ROUTES,\n executeA2ARequest,\n handleChatStream,\n handleExecuteWorkflow,\n handleGenerateObject,\n handleGenerateText,\n handleGetAgent,\n handleGetAgentHistory,\n handleGetAgents,\n handleGetLogs,\n handleGetWorkflow,\n handleGetWorkflowState,\n handleGetWorkflows,\n handleResumeWorkflow,\n handleStreamObject,\n handleStreamText,\n handleStreamWorkflow,\n handleSuspendWorkflow,\n isErrorResponse,\n mapLogResponse,\n parseJsonRpcRequest,\n resolveAgentCard,\n} from \"@voltagent/server-core\";\nimport type { Hono } from \"hono\";\n\nfunction parseJsonSafe<T>(raw: string, logger: Logger): T | undefined {\n try {\n return JSON.parse(raw) as T;\n } catch (error) {\n logger.warn(\"Failed to parse JSON payload\", { error });\n return undefined;\n }\n}\n\nasync function readJsonBody<T>(c: any, logger: Logger): Promise<T | undefined> {\n try {\n return (await c.req.json()) as T;\n } catch (error) {\n logger.warn(\"Invalid JSON body received\", { error, path: c.req.path });\n return undefined;\n }\n}\n\nfunction parseContextCandidate(candidate: unknown): A2ARequestContext | undefined {\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) {\n return undefined;\n }\n\n const { userId, sessionId, metadata } = candidate as Record<string, unknown>;\n const context: A2ARequestContext = {};\n\n if (typeof userId === \"string\") {\n context.userId = userId;\n }\n\n if (typeof sessionId === \"string\") {\n context.sessionId = sessionId;\n }\n\n if (metadata && typeof metadata === \"object\" && !Array.isArray(metadata)) {\n context.metadata = metadata as Record<string, unknown>;\n }\n\n return Object.keys(context).length > 0 ? context : undefined;\n}\n\nfunction mergeContexts(\n base: A2ARequestContext | undefined,\n next: A2ARequestContext | undefined,\n): A2ARequestContext | undefined {\n if (!base) {\n return next;\n }\n if (!next) {\n return base;\n }\n\n const merged: A2ARequestContext = {\n ...base,\n ...next,\n };\n\n if (base.metadata || next.metadata) {\n merged.metadata = {\n ...(base.metadata ?? {}),\n ...(next.metadata ?? {}),\n };\n }\n\n return merged;\n}\n\nexport function registerAgentRoutes(app: Hono, deps: ServerProviderDeps, logger: Logger) {\n app.get(AGENT_ROUTES.listAgents.path, async (c) => {\n const response = await handleGetAgents(deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.get(AGENT_ROUTES.getAgent.path, async (c) => {\n const agentId = c.req.param(\"id\");\n const response = await handleGetAgent(agentId, deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.post(AGENT_ROUTES.generateText.path, async (c) => {\n const agentId = c.req.param(\"id\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ success: false, error: \"Invalid JSON body\" }, 400);\n }\n const signal = c.req.raw.signal;\n const response = await handleGenerateText(agentId, body, deps, logger, signal);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.post(AGENT_ROUTES.streamText.path, async (c) => {\n const agentId = c.req.param(\"id\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n const signal = c.req.raw.signal;\n const response = await handleStreamText(agentId, body, deps, logger, signal);\n return response;\n });\n\n app.post(AGENT_ROUTES.chatStream.path, async (c) => {\n const agentId = c.req.param(\"id\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n const signal = c.req.raw.signal;\n return handleChatStream(agentId, body, deps, logger, signal);\n });\n\n app.post(AGENT_ROUTES.generateObject.path, async (c) => {\n const agentId = c.req.param(\"id\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ success: false, error: \"Invalid JSON body\" }, 400);\n }\n const signal = c.req.raw.signal;\n const response = await handleGenerateObject(agentId, body, deps, logger, signal);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.post(AGENT_ROUTES.streamObject.path, async (c) => {\n const agentId = c.req.param(\"id\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n const signal = c.req.raw.signal;\n return handleStreamObject(agentId, body, deps, logger, signal);\n });\n\n app.get(AGENT_ROUTES.getAgentHistory.path, async (c) => {\n const agentId = c.req.param(\"id\");\n const page = Number.parseInt(c.req.query(\"page\") || \"0\", 10);\n const limit = Number.parseInt(c.req.query(\"limit\") || \"10\", 10);\n const response = await handleGetAgentHistory(agentId, page, limit, deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n}\n\nexport function registerWorkflowRoutes(app: Hono, deps: ServerProviderDeps, logger: Logger) {\n app.get(WORKFLOW_ROUTES.listWorkflows.path, async (c) => {\n const response = await handleGetWorkflows(deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.get(WORKFLOW_ROUTES.getWorkflow.path, async (c) => {\n const workflowId = c.req.param(\"id\");\n const response = await handleGetWorkflow(workflowId, deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.post(WORKFLOW_ROUTES.executeWorkflow.path, async (c) => {\n const workflowId = c.req.param(\"id\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ success: false, error: \"Invalid JSON body\" }, 400);\n }\n const response = await handleExecuteWorkflow(workflowId, body, deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.post(WORKFLOW_ROUTES.streamWorkflow.path, async (c) => {\n const workflowId = c.req.param(\"id\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ error: \"Invalid JSON body\" }, 400);\n }\n\n const response = await handleStreamWorkflow(workflowId, body, deps, logger);\n\n if (isErrorResponse(response)) {\n return c.json(response, 500);\n }\n\n return c.body(response, 200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n });\n\n app.post(WORKFLOW_ROUTES.suspendWorkflow.path, async (c) => {\n const executionId = c.req.param(\"executionId\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ success: false, error: \"Invalid JSON body\" }, 400);\n }\n const response = await handleSuspendWorkflow(executionId, body, deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.post(WORKFLOW_ROUTES.resumeWorkflow.path, async (c) => {\n const workflowId = c.req.param(\"id\");\n const executionId = c.req.param(\"executionId\");\n const body = await readJsonBody(c, logger);\n if (!body) {\n return c.json({ success: false, error: \"Invalid JSON body\" }, 400);\n }\n const response = await handleResumeWorkflow(workflowId, executionId, body, deps, logger);\n return c.json(response, response.success ? 200 : 500);\n });\n\n app.get(WORKFLOW_ROUTES.getWorkflowState.path, async (c) => {\n const workflowId = c.req.param(\"id\");\n const executionId = c.req.param(\"executionId\");\n const response = await handleGetWorkflowState(workflowId, executionId, deps, logger);\n const status = response.success ? 200 : response.error?.includes(\"not found\") ? 404 : 500;\n return c.json(response, status);\n });\n}\n\nexport function registerLogRoutes(app: Hono, deps: ServerProviderDeps, logger: Logger) {\n app.get(\"/logs\", async (c) => {\n const query = c.req.query();\n const options = {\n limit: query.limit ? Number(query.limit) : undefined,\n level: query.level as any,\n agentId: query.agentId,\n workflowId: query.workflowId,\n conversationId: query.conversationId,\n executionId: query.executionId,\n since: query.since,\n until: query.until,\n };\n\n const response = await handleGetLogs(options, deps, logger);\n if (!response.success) {\n return c.json(response, 500);\n }\n\n const mapped = mapLogResponse(response);\n return c.json(mapped, 200);\n });\n}\n\nexport function registerObservabilityRoutes(app: Hono, deps: ServerProviderDeps, logger: Logger) {\n app.post(OBSERVABILITY_ROUTES.setupObservability.path, (c) =>\n c.json(\n {\n success: false,\n error: \"Observability setup is not available in the serverless runtime.\",\n },\n 501,\n ),\n );\n\n app.get(OBSERVABILITY_ROUTES.getTraces.path, async (c) => {\n const query = c.req.query();\n logger.debug(\"[serverless] GET /observability/traces\", { query });\n const result = await getTracesHandler(deps, query);\n return c.json(result, result.success ? 200 : 500);\n });\n\n app.get(OBSERVABILITY_ROUTES.getTraceById.path, async (c) => {\n const traceId = c.req.param(\"traceId\");\n logger.debug(\"[serverless] GET /observability/traces/:traceId\", { traceId });\n const result = await getTraceByIdHandler(traceId, deps);\n return c.json(result, result.success ? 200 : 404);\n });\n\n app.get(OBSERVABILITY_ROUTES.getSpanById.path, async (c) => {\n const spanId = c.req.param(\"spanId\");\n logger.debug(\"[serverless] GET /observability/spans/:spanId\", { spanId });\n const result = await getSpanByIdHandler(spanId, deps);\n return c.json(result, result.success ? 200 : 404);\n });\n\n app.get(OBSERVABILITY_ROUTES.getObservabilityStatus.path, async (c) => {\n logger.debug(\"[serverless] GET /observability/status\");\n const result = await getObservabilityStatusHandler(deps);\n return c.json(result, result.success ? 200 : 500);\n });\n\n app.get(OBSERVABILITY_ROUTES.getLogsByTraceId.path, async (c) => {\n const traceId = c.req.param(\"traceId\");\n logger.debug(\"[serverless] GET /observability/traces/:traceId/logs\", { traceId });\n const result = await getLogsByTraceIdHandler(traceId, deps);\n return c.json(result, result.success ? 200 : 404);\n });\n\n app.get(OBSERVABILITY_ROUTES.getLogsBySpanId.path, async (c) => {\n const spanId = c.req.param(\"spanId\");\n logger.debug(\"[serverless] GET /observability/spans/:spanId/logs\", { spanId });\n const result = await getLogsBySpanIdHandler(spanId, deps);\n return c.json(result, result.success ? 200 : 404);\n });\n\n app.get(OBSERVABILITY_ROUTES.queryLogs.path, async (c) => {\n const query = c.req.query();\n logger.debug(\"[serverless] GET /observability/logs\", { query });\n const result = await queryLogsHandler(query, deps);\n return c.json(result, result.success ? 200 : 400);\n });\n}\n\nexport function registerA2ARoutes(app: Hono, deps: ServerProviderDeps, logger: Logger) {\n const registry = deps.a2a?.registry as A2AServerRegistry<A2AServerLikeWithHandlers> | undefined;\n\n if (!registry) {\n logger.debug(\"A2A server registry not available on server deps; skipping A2A routes\");\n return;\n }\n\n app.get(A2A_ROUTES.agentCard.path, (c) => {\n const serverId = c.req.param(\"serverId\");\n if (!serverId) {\n return c.json({ success: false, error: \"Missing serverId parameter\" }, 400);\n }\n try {\n const card = resolveAgentCard(registry, serverId, serverId, {});\n return c.json(card, 200);\n } catch (error) {\n const status = error instanceof Error && error.message.includes(\"not found\") ? 404 : 400;\n return c.json(\n { success: false, error: error instanceof Error ? error.message : String(error) },\n status,\n );\n }\n });\n\n app.post(A2A_ROUTES.jsonRpc.path, async (c) => {\n const serverId = c.req.param(\"serverId\");\n if (!serverId) {\n return c.json(\n { jsonrpc: \"2.0\", error: { code: -32600, message: \"Missing serverId\" }, id: null },\n 400,\n );\n }\n type JsonRpcPayload = ReturnType<typeof parseJsonRpcRequest>;\n let request: JsonRpcPayload | undefined;\n let context: A2ARequestContext | undefined;\n\n try {\n const queryContext = c.req.query(\"context\") ?? c.req.query(\"runtimeContext\");\n if (queryContext) {\n const parsedQueryContext = parseJsonSafe<Record<string, unknown>>(queryContext, logger);\n context = mergeContexts(context, parseContextCandidate(parsedQueryContext));\n }\n\n const body = await readJsonBody<Record<string, unknown> | JsonRpcRequest | JsonRpcRequest[]>(\n c,\n logger,\n );\n if (!body) {\n return c.json(\n { jsonrpc: \"2.0\", error: { code: -32600, message: \"Invalid request\" }, id: null },\n 400,\n );\n }\n\n if (typeof (body as Record<string, unknown>).context !== \"undefined\") {\n const { context: bodyContext, ...rest } = body as Record<string, unknown>;\n context = mergeContexts(context, parseContextCandidate(bodyContext));\n request = parseJsonRpcRequest(rest as unknown);\n } else {\n request = parseJsonRpcRequest(body as unknown);\n }\n } catch (error) {\n return c.json(\n { jsonrpc: \"2.0\", error: { code: -32600, message: String(error) }, id: null },\n 400,\n );\n }\n\n const response = await executeA2ARequest({\n registry,\n serverId,\n request,\n context,\n logger,\n });\n\n if (\"kind\" in response && response.kind === \"stream\") {\n const { stream, id } = response;\n const encoder = new TextEncoder();\n const abortSignal = c.req.raw.signal;\n let abortListener: (() => void) | undefined;\n let cleanedUp = false;\n\n const cleanup = async () => {\n if (abortSignal && abortListener) {\n abortSignal.removeEventListener(\"abort\", abortListener);\n abortListener = undefined;\n }\n if (!cleanedUp && typeof stream.return === \"function\") {\n cleanedUp = true;\n try {\n await stream.return(undefined as any);\n } catch {\n // ignore completion errors\n }\n }\n };\n\n const sseStream = new ReadableStream<Uint8Array>({\n async start(controller) {\n if (abortSignal) {\n if (abortSignal.aborted) {\n await cleanup();\n controller.close();\n return;\n }\n\n abortListener = () => {\n controller.close();\n void cleanup();\n };\n\n abortSignal.addEventListener(\"abort\", abortListener, { once: true });\n }\n\n try {\n for await (const chunk of stream) {\n const payload = safeStringify(chunk);\n controller.enqueue(encoder.encode(`data: \\u001E${payload}\\n\\n`));\n }\n } catch (error) {\n const payload = safeStringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: String(error) },\n id,\n });\n controller.enqueue(encoder.encode(`data: \\u001E${payload}\\n\\n`));\n } finally {\n await cleanup();\n controller.close();\n }\n },\n async cancel() {\n await cleanup();\n },\n });\n\n return new Response(sseStream, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n },\n });\n }\n\n const jsonResponse = response as JsonRpcResponse;\n return c.json(jsonResponse, jsonResponse.error ? 400 : 200);\n });\n}\n","import type { ServerlessRuntime } from \"../types\";\n\nexport function detectServerlessRuntime(): ServerlessRuntime {\n // @ts-ignore - Cloudflare Workers expose globalThis.Deno but with specific flags\n if (typeof globalThis.Deno !== \"undefined\") {\n return \"deno\";\n }\n\n // @ts-ignore - Vercel Edge Runtime sets EdgeRuntime global\n if (typeof globalThis.EdgeRuntime !== \"undefined\") {\n return \"vercel\";\n }\n\n // @ts-ignore - Cloudflare Workers include navigator.userAgent\n if (globalThis.navigator?.userAgent?.includes(\"Cloudflare\")) {\n return \"cloudflare\";\n }\n\n return \"unknown\";\n}\n","import type { IServerlessProvider, ServerProviderDeps } from \"@voltagent/core\";\nimport type { Hono } from \"hono\";\nimport { createServerlessApp } from \"./app-factory\";\nimport type { ServerlessConfig, ServerlessRuntime } from \"./types\";\nimport { detectServerlessRuntime } from \"./utils/runtime-detection\";\n\ntype VoltAgentGlobal = typeof globalThis & {\n ___voltagent_wait_until?: (promise: Promise<unknown>) => void;\n};\nexport class HonoServerlessProvider implements IServerlessProvider {\n private readonly deps: ServerProviderDeps;\n private readonly config?: ServerlessConfig;\n private readonly appPromise: Promise<Hono>;\n\n constructor(deps: ServerProviderDeps, config?: ServerlessConfig) {\n this.deps = deps;\n this.config = config;\n this.appPromise = this.initializeApp();\n }\n\n private async initializeApp(): Promise<Hono> {\n return createServerlessApp(this.deps, this.config);\n }\n\n private async getApp(): Promise<Hono> {\n return this.appPromise;\n }\n\n private async ensureEnvironmentTarget(target?: Record<string, unknown>): Promise<void> {\n if (this.deps.ensureEnvironment) {\n await Promise.resolve(this.deps.ensureEnvironment(target));\n }\n }\n\n async handleRequest(request: Request): Promise<Response> {\n await this.ensureEnvironmentTarget();\n const app = await this.getApp();\n return app.fetch(request);\n }\n\n toCloudflareWorker() {\n return {\n fetch: async (\n request: Request,\n env: Record<string, unknown>,\n executionCtx: unknown,\n ): Promise<Response> => {\n const waitUntil =\n executionCtx && typeof (executionCtx as any)?.waitUntil === \"function\"\n ? (executionCtx as any).waitUntil.bind(executionCtx)\n : undefined;\n\n const globals = globalThis as VoltAgentGlobal;\n const previousWaitUntil = globals.___voltagent_wait_until;\n\n if (waitUntil) {\n globals.___voltagent_wait_until = (promise) => {\n try {\n waitUntil(promise);\n } catch {\n void promise;\n }\n };\n }\n\n try {\n await this.ensureEnvironmentTarget(env);\n const app = await this.getApp();\n return await app.fetch(request, env as Record<string, unknown>, executionCtx as any);\n } finally {\n if (waitUntil) {\n if (previousWaitUntil) {\n globals.___voltagent_wait_until = previousWaitUntil;\n } else {\n globals.___voltagent_wait_until = undefined;\n }\n }\n }\n },\n };\n }\n\n toVercelEdge(): (request: Request, context?: unknown) => Promise<Response> {\n return async (request: Request, context?: unknown) => {\n await this.ensureEnvironmentTarget(context as Record<string, unknown> | undefined);\n const app = await this.getApp();\n return app.fetch(request, context as Record<string, unknown> | undefined);\n };\n }\n\n toDeno(): (request: Request, info?: unknown) => Promise<Response> {\n return async (request: Request, info?: unknown) => {\n await this.ensureEnvironmentTarget(info as Record<string, unknown> | undefined);\n const app = await this.getApp();\n return app.fetch(request, info as Record<string, unknown> | undefined);\n };\n }\n\n auto():\n | { fetch: (req: Request, env: Record<string, unknown>, ctx: unknown) => Promise<Response> }\n | ((req: Request, ctx?: unknown) => Promise<Response>) {\n const runtime: ServerlessRuntime = detectServerlessRuntime();\n\n switch (runtime) {\n case \"cloudflare\":\n return this.toCloudflareWorker();\n case \"vercel\":\n return this.toVercelEdge();\n case \"deno\":\n return this.toDeno();\n default:\n return this.toCloudflareWorker();\n }\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport type { VoltAgent } from \"@voltagent/core\";\n\ninterface NetlifyFunctionEvent {\n httpMethod?: string;\n headers?: Record<string, string | undefined>;\n multiValueHeaders?: Record<string, (string | undefined)[] | undefined>;\n rawUrl?: string;\n rawQuery?: string;\n rawPath?: string;\n path?: string;\n body?: string | null;\n isBase64Encoded?: boolean;\n}\n\ninterface NetlifyFunctionResult {\n statusCode: number;\n headers?: Record<string, string>;\n multiValueHeaders?: Record<string, string[]>;\n body: string;\n isBase64Encoded: boolean;\n}\n\ntype NetlifyFunctionHandler = (\n event: NetlifyFunctionEvent,\n context: unknown,\n) => Promise<NetlifyFunctionResult>;\n\nconst TEXT_BODY_METHODS = new Set([\"GET\", \"HEAD\"]);\n\nfunction buildUrl(event: NetlifyFunctionEvent): string {\n const scheme = event.headers?.[\"x-forwarded-proto\"] || \"https\";\n const host = event.headers?.host || \"localhost\";\n const path = event.rawPath || event.path || \"/\";\n const query = event.rawQuery ? `?${event.rawQuery}` : \"\";\n return `${scheme}://${host}${path}${query}`;\n}\n\nfunction createRequest(event: NetlifyFunctionEvent): Request {\n const method = (event.httpMethod || \"GET\").toUpperCase();\n const headers = new Headers();\n\n if (event.multiValueHeaders) {\n for (const [key, values] of Object.entries(event.multiValueHeaders)) {\n if (!values) continue;\n for (const value of values) {\n if (value !== undefined) {\n headers.append(key, value);\n }\n }\n }\n }\n\n if (event.headers) {\n for (const [key, value] of Object.entries(event.headers)) {\n if (value !== undefined) {\n headers.set(key, value);\n }\n }\n }\n\n const url = event.rawUrl || buildUrl(event);\n\n const init: Record<string, unknown> = { method, headers };\n\n if (!TEXT_BODY_METHODS.has(method) && event.body) {\n init.body = event.isBase64Encoded ? Buffer.from(event.body, \"base64\") : event.body;\n }\n\n return new Request(url, init as RequestInit);\n}\n\nfunction toNetlifyResponse(response: Response): Promise<NetlifyFunctionResult> {\n const single: Record<string, string> = {};\n const multi: Record<string, string[]> = {};\n\n response.headers.forEach((value, key) => {\n if (single[key]) {\n multi[key] = [single[key], value];\n delete single[key];\n } else if (multi[key]) {\n multi[key].push(value);\n } else {\n single[key] = value;\n }\n });\n\n return response.arrayBuffer().then((buffer) => ({\n statusCode: response.status,\n headers: Object.keys(single).length > 0 ? single : undefined,\n multiValueHeaders: Object.keys(multi).length > 0 ? multi : undefined,\n body: Buffer.from(buffer).toString(\"base64\"),\n isBase64Encoded: true,\n }));\n}\n\nexport function createNetlifyFunctionHandler(voltAgent: VoltAgent): NetlifyFunctionHandler {\n const provider = voltAgent.serverless();\n\n return async (event) => {\n const request = createRequest(event);\n const response = await provider.handleRequest(request);\n return toNetlifyResponse(response);\n };\n}\n\nexport type { NetlifyFunctionHandler, NetlifyFunctionEvent, NetlifyFunctionResult };\n","import type { ServerProviderDeps } from \"@voltagent/core\";\nimport { HonoServerlessProvider } from \"./serverless-provider\";\nimport type { ServerlessConfig } from \"./types\";\n\nexport function serverlessHono(config?: ServerlessConfig) {\n return (deps: ServerProviderDeps) => new HonoServerlessProvider(deps, config);\n}\n\nexport { HonoServerlessProvider } from \"./serverless-provider\";\nexport type { ServerlessConfig, ServerlessRuntime } from \"./types\";\nexport { detectServerlessRuntime } from \"./utils/runtime-detection\";\nexport {\n createNetlifyFunctionHandler,\n type NetlifyFunctionEvent,\n type NetlifyFunctionHandler,\n type NetlifyFunctionResult,\n} from \"./netlify-function\";\nexport default serverlessHono;\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@voltagent/serverless-hono",
|
|
3
|
+
"description": "Serverless (fetch-based) runtime provider for VoltAgent using Hono",
|
|
4
|
+
"version": "1.0.1",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"@voltagent/internal": "^0.0.11",
|
|
7
|
+
"@voltagent/server-core": "^1.0.12",
|
|
8
|
+
"hono": "^4.7.7"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"tsup": "^8.5.0",
|
|
12
|
+
"typescript": "^5.8.2",
|
|
13
|
+
"vitest": "^3.2.4"
|
|
14
|
+
},
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.js",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"main": "dist/index.js",
|
|
27
|
+
"module": "dist/index.js",
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@voltagent/core": "^1.0.0",
|
|
30
|
+
"@voltagent/server-core": "^1.0.0",
|
|
31
|
+
"hono": "^4.0.0"
|
|
32
|
+
},
|
|
33
|
+
"type": "module",
|
|
34
|
+
"types": "dist/index.d.ts",
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"dev": "tsup --watch",
|
|
38
|
+
"test": "vitest",
|
|
39
|
+
"typecheck": "tsc --noEmit"
|
|
40
|
+
}
|
|
41
|
+
}
|