@copilotkitnext/runtime 1.51.4 → 1.51.5-next.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/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/endpoints/express-single.cjs +187 -0
- package/dist/endpoints/express-single.cjs.map +1 -0
- package/dist/endpoints/express-single.d.cts +15 -0
- package/dist/endpoints/express-single.d.cts.map +1 -0
- package/dist/endpoints/express-single.d.mts +15 -0
- package/dist/endpoints/express-single.d.mts.map +1 -0
- package/dist/endpoints/express-single.mjs +184 -0
- package/dist/endpoints/express-single.mjs.map +1 -0
- package/dist/endpoints/express-utils.cjs +118 -0
- package/dist/endpoints/express-utils.cjs.map +1 -0
- package/dist/endpoints/express-utils.mjs +116 -0
- package/dist/endpoints/express-utils.mjs.map +1 -0
- package/dist/endpoints/express.cjs +165 -0
- package/dist/endpoints/express.cjs.map +1 -0
- package/dist/endpoints/express.d.cts +15 -0
- package/dist/endpoints/express.d.cts.map +1 -0
- package/dist/endpoints/express.d.mts +15 -0
- package/dist/endpoints/express.d.mts.map +1 -0
- package/dist/endpoints/express.mjs +162 -0
- package/dist/endpoints/express.mjs.map +1 -0
- package/dist/endpoints/hono-single.cjs +140 -0
- package/dist/endpoints/hono-single.cjs.map +1 -0
- package/dist/endpoints/hono-single.d.cts +31 -0
- package/dist/endpoints/hono-single.d.cts.map +1 -0
- package/dist/endpoints/hono-single.d.mts +31 -0
- package/dist/endpoints/hono-single.d.mts.map +1 -0
- package/dist/endpoints/hono-single.mjs +139 -0
- package/dist/endpoints/hono-single.mjs.map +1 -0
- package/dist/endpoints/hono.cjs +152 -0
- package/dist/endpoints/hono.cjs.map +1 -0
- package/dist/endpoints/hono.d.cts +47 -0
- package/dist/endpoints/hono.d.cts.map +1 -0
- package/dist/endpoints/hono.d.mts +47 -0
- package/dist/endpoints/hono.d.mts.map +1 -0
- package/dist/endpoints/hono.mjs +151 -0
- package/dist/endpoints/hono.mjs.map +1 -0
- package/dist/endpoints/index.cjs +2 -0
- package/dist/endpoints/index.d.mts +2 -0
- package/dist/endpoints/index.mjs +4 -0
- package/dist/endpoints/single-route-helpers.cjs +67 -0
- package/dist/endpoints/single-route-helpers.cjs.map +1 -0
- package/dist/endpoints/single-route-helpers.mjs +64 -0
- package/dist/endpoints/single-route-helpers.mjs.map +1 -0
- package/dist/express.cjs +6 -0
- package/dist/express.d.cts +3 -0
- package/dist/express.d.mts +3 -19
- package/dist/express.mjs +3 -477
- package/dist/handlers/get-runtime-info.cjs +36 -0
- package/dist/handlers/get-runtime-info.cjs.map +1 -0
- package/dist/handlers/get-runtime-info.mjs +36 -0
- package/dist/handlers/get-runtime-info.mjs.map +1 -0
- package/dist/handlers/handle-connect.cjs +102 -0
- package/dist/handlers/handle-connect.cjs.map +1 -0
- package/dist/handlers/handle-connect.mjs +101 -0
- package/dist/handlers/handle-connect.mjs.map +1 -0
- package/dist/handlers/handle-run.cjs +114 -0
- package/dist/handlers/handle-run.cjs.map +1 -0
- package/dist/handlers/handle-run.mjs +113 -0
- package/dist/handlers/handle-run.mjs.map +1 -0
- package/dist/handlers/handle-stop.cjs +46 -0
- package/dist/handlers/handle-stop.cjs.map +1 -0
- package/dist/handlers/handle-stop.mjs +45 -0
- package/dist/handlers/handle-stop.mjs.map +1 -0
- package/dist/handlers/handle-transcribe.cjs +111 -0
- package/dist/handlers/handle-transcribe.cjs.map +1 -0
- package/dist/handlers/handle-transcribe.mjs +110 -0
- package/dist/handlers/handle-transcribe.mjs.map +1 -0
- package/dist/handlers/header-utils.cjs +25 -0
- package/dist/handlers/header-utils.cjs.map +1 -0
- package/dist/handlers/header-utils.mjs +24 -0
- package/dist/handlers/header-utils.mjs.map +1 -0
- package/dist/index.cjs +25 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.mts +9 -139
- package/dist/index.mjs +10 -335
- package/dist/middleware.cjs +29 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.cts +24 -0
- package/dist/middleware.d.cts.map +1 -0
- package/dist/middleware.d.mts +24 -0
- package/dist/middleware.d.mts.map +1 -0
- package/dist/middleware.mjs +27 -0
- package/dist/middleware.mjs.map +1 -0
- package/dist/package.cjs +12 -0
- package/dist/package.cjs.map +1 -0
- package/dist/package.mjs +6 -0
- package/dist/package.mjs.map +1 -0
- package/dist/runner/agent-runner.cjs +7 -0
- package/dist/runner/agent-runner.cjs.map +1 -0
- package/dist/runner/agent-runner.d.cts +28 -0
- package/dist/runner/agent-runner.d.cts.map +1 -0
- package/dist/runner/agent-runner.d.mts +28 -0
- package/dist/runner/agent-runner.d.mts.map +1 -0
- package/dist/runner/agent-runner.mjs +6 -0
- package/dist/runner/agent-runner.mjs.map +1 -0
- package/dist/runner/in-memory.cjs +230 -0
- package/dist/runner/in-memory.cjs.map +1 -0
- package/dist/runner/in-memory.d.cts +14 -0
- package/dist/runner/in-memory.d.cts.map +1 -0
- package/dist/runner/in-memory.d.mts +14 -0
- package/dist/runner/in-memory.d.mts.map +1 -0
- package/dist/runner/in-memory.mjs +229 -0
- package/dist/runner/in-memory.mjs.map +1 -0
- package/dist/runner/index.cjs +4 -0
- package/dist/runner/index.d.cts +4 -0
- package/dist/runner/index.d.mts +4 -0
- package/dist/runner/index.mjs +5 -0
- package/dist/runtime.cjs +27 -0
- package/dist/runtime.cjs.map +1 -0
- package/dist/runtime.d.cts +43 -0
- package/dist/runtime.d.cts.map +1 -0
- package/dist/runtime.d.mts +43 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +26 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/transcription-service/transcription-service.cjs +7 -0
- package/dist/transcription-service/transcription-service.cjs.map +1 -0
- package/dist/transcription-service/transcription-service.d.cts +14 -0
- package/dist/transcription-service/transcription-service.d.cts.map +1 -0
- package/dist/transcription-service/transcription-service.d.mts +14 -0
- package/dist/transcription-service/transcription-service.d.mts.map +1 -0
- package/dist/transcription-service/transcription-service.mjs +6 -0
- package/dist/transcription-service/transcription-service.mjs.map +1 -0
- package/package.json +25 -22
- package/tsdown.config.ts +16 -0
- package/dist/chunk-5GKH3W25.mjs +0 -1054
- package/dist/chunk-5GKH3W25.mjs.map +0 -1
- package/dist/express.d.ts +0 -19
- package/dist/express.js +0 -1292
- package/dist/express.js.map +0 -1
- package/dist/express.mjs.map +0 -1
- package/dist/index.d.ts +0 -139
- package/dist/index.js +0 -1387
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/runtime-BsuyYT2l.d.mts +0 -98
- package/dist/runtime-BsuyYT2l.d.ts +0 -98
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { logger } from "@copilotkitnext/shared";
|
|
2
|
+
import { Readable, pipeline } from "node:stream";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
|
|
5
|
+
//#region src/endpoints/express-utils.ts
|
|
6
|
+
const streamPipeline = promisify(pipeline);
|
|
7
|
+
const METHODS_WITHOUT_BODY = new Set(["GET", "HEAD"]);
|
|
8
|
+
function createFetchRequestFromExpress(req) {
|
|
9
|
+
const method = req.method?.toUpperCase() ?? "GET";
|
|
10
|
+
const url = `${buildOrigin(req)}${req.originalUrl ?? req.url ?? ""}`;
|
|
11
|
+
const headers = new Headers();
|
|
12
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
13
|
+
if (value === void 0) continue;
|
|
14
|
+
if (Array.isArray(value)) value.forEach((v) => headers.append(key, v));
|
|
15
|
+
else headers.set(key, value);
|
|
16
|
+
}
|
|
17
|
+
const init = {
|
|
18
|
+
method,
|
|
19
|
+
headers
|
|
20
|
+
};
|
|
21
|
+
const hasParsedBody = req.body !== void 0 && req.body !== null;
|
|
22
|
+
const streamConsumed = isStreamConsumed(req, hasParsedBody);
|
|
23
|
+
if (!METHODS_WITHOUT_BODY.has(method)) if (req.readable !== false && !streamConsumed) {
|
|
24
|
+
init.body = Readable.toWeb(req);
|
|
25
|
+
init.duplex = "half";
|
|
26
|
+
} else if (hasParsedBody) {
|
|
27
|
+
const { body, contentType } = synthesizeBody(req.body);
|
|
28
|
+
if (contentType) headers.set("content-type", contentType);
|
|
29
|
+
headers.delete("content-length");
|
|
30
|
+
if (body !== void 0) init.body = body;
|
|
31
|
+
logger.info({
|
|
32
|
+
url,
|
|
33
|
+
method,
|
|
34
|
+
readable: req.readable,
|
|
35
|
+
readableEnded: req.readableEnded,
|
|
36
|
+
complete: req.complete
|
|
37
|
+
}, "Express request stream already consumed; synthesized body from parsed content");
|
|
38
|
+
} else {
|
|
39
|
+
headers.delete("content-length");
|
|
40
|
+
logger.warn({
|
|
41
|
+
url,
|
|
42
|
+
method
|
|
43
|
+
}, "Request stream already consumed but no body was available; sending empty body");
|
|
44
|
+
}
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const abort = () => controller.abort();
|
|
47
|
+
req.on("aborted", abort);
|
|
48
|
+
req.on("error", abort);
|
|
49
|
+
req.on("close", () => {
|
|
50
|
+
if (req.aborted) abort();
|
|
51
|
+
});
|
|
52
|
+
init.signal = controller.signal;
|
|
53
|
+
try {
|
|
54
|
+
return new Request(url, init);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {
|
|
57
|
+
headers.delete("content-length");
|
|
58
|
+
delete init.duplex;
|
|
59
|
+
if (hasParsedBody) {
|
|
60
|
+
const { body, contentType } = synthesizeBody(req.body);
|
|
61
|
+
if (contentType) headers.set("content-type", contentType);
|
|
62
|
+
init.body = body;
|
|
63
|
+
logger.info({
|
|
64
|
+
url,
|
|
65
|
+
method
|
|
66
|
+
}, "Request stream disturbed while constructing Request; reused parsed body");
|
|
67
|
+
} else {
|
|
68
|
+
init.body = void 0;
|
|
69
|
+
logger.warn({
|
|
70
|
+
url,
|
|
71
|
+
method
|
|
72
|
+
}, "Request stream was disturbed; falling back to empty body");
|
|
73
|
+
}
|
|
74
|
+
return new Request(url, init);
|
|
75
|
+
}
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function sendFetchResponse(res, response) {
|
|
80
|
+
res.status(response.status);
|
|
81
|
+
response.headers.forEach((value, key) => {
|
|
82
|
+
if (key.toLowerCase() === "content-length" && response.body !== null) return;
|
|
83
|
+
res.setHeader(key, value);
|
|
84
|
+
});
|
|
85
|
+
if (!response.body) {
|
|
86
|
+
res.end();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const nodeStream = Readable.fromWeb(response.body);
|
|
90
|
+
try {
|
|
91
|
+
await streamPipeline(nodeStream, res);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
res.destroy(error);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function buildOrigin(req) {
|
|
98
|
+
return `${req.protocol || (req.secure ? "https" : "http")}://${req.get("host") ?? "localhost"}`;
|
|
99
|
+
}
|
|
100
|
+
function isStreamConsumed(req, hasParsedBody) {
|
|
101
|
+
const state = req._readableState;
|
|
102
|
+
return Boolean(hasParsedBody || req.readableEnded || req.complete || state?.ended || state?.endEmitted);
|
|
103
|
+
}
|
|
104
|
+
function synthesizeBody(body) {
|
|
105
|
+
if (Buffer.isBuffer(body) || body instanceof Uint8Array) return { body };
|
|
106
|
+
if (typeof body === "string") return { body };
|
|
107
|
+
if (typeof body === "object" && body !== void 0) return {
|
|
108
|
+
body: JSON.stringify(body),
|
|
109
|
+
contentType: "application/json"
|
|
110
|
+
};
|
|
111
|
+
return {};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
//#endregion
|
|
115
|
+
export { createFetchRequestFromExpress, sendFetchResponse };
|
|
116
|
+
//# sourceMappingURL=express-utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-utils.mjs","names":[],"sources":["../../src/endpoints/express-utils.ts"],"sourcesContent":["import type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n} from \"express\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@copilotkitnext/shared\";\n\nconst streamPipeline = promisify(pipeline);\n\nconst METHODS_WITHOUT_BODY = new Set([\"GET\", \"HEAD\"]);\n\nexport function createFetchRequestFromExpress(req: ExpressRequest): Request {\n const method = req.method?.toUpperCase() ?? \"GET\";\n const origin = buildOrigin(req);\n const url = `${origin}${req.originalUrl ?? req.url ?? \"\"}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((v) => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n };\n\n const hasParsedBody = req.body !== undefined && req.body !== null;\n const streamConsumed = isStreamConsumed(req, hasParsedBody);\n\n if (!METHODS_WITHOUT_BODY.has(method)) {\n const canStreamBody = req.readable !== false && !streamConsumed;\n\n if (canStreamBody) {\n init.body = Readable.toWeb(req) as unknown as BodyInit;\n init.duplex = \"half\";\n } else if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n headers.delete(\"content-length\");\n if (body !== undefined) {\n init.body = body;\n }\n logger.info(\n {\n url,\n method,\n readable: req.readable,\n readableEnded: req.readableEnded,\n complete: req.complete,\n },\n \"Express request stream already consumed; synthesized body from parsed content\",\n );\n } else {\n headers.delete(\"content-length\");\n logger.warn(\n { url, method },\n \"Request stream already consumed but no body was available; sending empty body\",\n );\n }\n }\n\n const controller = new AbortController();\n const abort = () => controller.abort();\n req.on(\"aborted\", abort);\n req.on(\"error\", abort);\n req.on(\"close\", () => {\n if (req.aborted) {\n abort();\n }\n });\n init.signal = controller.signal;\n\n try {\n return new Request(url, init);\n } catch (error) {\n if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {\n // Fallback to synthesized/empty body when the stream was already consumed.\n headers.delete(\"content-length\");\n delete init.duplex;\n\n if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n init.body = body;\n logger.info(\n { url, method },\n \"Request stream disturbed while constructing Request; reused parsed body\",\n );\n } else {\n init.body = undefined;\n logger.warn(\n { url, method },\n \"Request stream was disturbed; falling back to empty body\",\n );\n }\n\n return new Request(url, init);\n }\n throw error;\n }\n}\n\nexport async function sendFetchResponse(\n res: ExpressResponse,\n response: Response,\n): Promise<void> {\n res.status(response.status);\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"content-length\" && response.body !== null) {\n return;\n }\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n const nodeStream = Readable.fromWeb(response.body as any);\n try {\n await streamPipeline(nodeStream, res);\n } catch (error) {\n res.destroy(error as Error);\n throw error;\n }\n}\n\nfunction buildOrigin(req: ExpressRequest): string {\n const protocol = req.protocol || (req.secure ? \"https\" : \"http\");\n const host = req.get(\"host\") ?? \"localhost\";\n return `${protocol}://${host}`;\n}\n\nfunction isStreamConsumed(\n req: ExpressRequest,\n hasParsedBody: boolean,\n): boolean {\n const state = (\n req as unknown as {\n _readableState?: { ended?: boolean; endEmitted?: boolean };\n }\n )._readableState;\n return Boolean(\n hasParsedBody ||\n req.readableEnded ||\n req.complete ||\n state?.ended ||\n state?.endEmitted,\n );\n}\n\nfunction synthesizeBody(body: unknown): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (Buffer.isBuffer(body) || body instanceof Uint8Array) {\n return { body };\n }\n\n if (typeof body === \"string\") {\n return { body };\n }\n\n if (typeof body === \"object\" && body !== undefined) {\n return { body: JSON.stringify(body), contentType: \"application/json\" };\n }\n\n return {};\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_handle_run = require('../handlers/handle-run.cjs');
|
|
3
|
+
const require_get_runtime_info = require('../handlers/get-runtime-info.cjs');
|
|
4
|
+
const require_handle_transcribe = require('../handlers/handle-transcribe.cjs');
|
|
5
|
+
const require_middleware = require('../middleware.cjs');
|
|
6
|
+
const require_handle_connect = require('../handlers/handle-connect.cjs');
|
|
7
|
+
const require_handle_stop = require('../handlers/handle-stop.cjs');
|
|
8
|
+
const require_express_utils = require('./express-utils.cjs');
|
|
9
|
+
let _copilotkitnext_shared = require("@copilotkitnext/shared");
|
|
10
|
+
let express = require("express");
|
|
11
|
+
express = require_runtime.__toESM(express);
|
|
12
|
+
let cors = require("cors");
|
|
13
|
+
cors = require_runtime.__toESM(cors);
|
|
14
|
+
|
|
15
|
+
//#region src/endpoints/express.ts
|
|
16
|
+
function createCopilotEndpointExpress({ runtime, basePath }) {
|
|
17
|
+
const router = express.default.Router();
|
|
18
|
+
const normalizedBase = normalizeBasePath(basePath);
|
|
19
|
+
router.use((0, cors.default)({
|
|
20
|
+
origin: "*",
|
|
21
|
+
methods: [
|
|
22
|
+
"GET",
|
|
23
|
+
"HEAD",
|
|
24
|
+
"PUT",
|
|
25
|
+
"POST",
|
|
26
|
+
"DELETE",
|
|
27
|
+
"PATCH",
|
|
28
|
+
"OPTIONS"
|
|
29
|
+
],
|
|
30
|
+
allowedHeaders: ["*"]
|
|
31
|
+
}));
|
|
32
|
+
router.post(joinPath(normalizedBase, "/agent/:agentId/run"), createRouteHandler(runtime, async ({ request, req }) => {
|
|
33
|
+
const agentId = req.params.agentId;
|
|
34
|
+
return require_handle_run.handleRunAgent({
|
|
35
|
+
runtime,
|
|
36
|
+
request,
|
|
37
|
+
agentId
|
|
38
|
+
});
|
|
39
|
+
}));
|
|
40
|
+
router.post(joinPath(normalizedBase, "/agent/:agentId/connect"), createRouteHandler(runtime, async ({ request, req }) => {
|
|
41
|
+
const agentId = req.params.agentId;
|
|
42
|
+
return require_handle_connect.handleConnectAgent({
|
|
43
|
+
runtime,
|
|
44
|
+
request,
|
|
45
|
+
agentId
|
|
46
|
+
});
|
|
47
|
+
}));
|
|
48
|
+
router.post(joinPath(normalizedBase, "/agent/:agentId/stop/:threadId"), createRouteHandler(runtime, async ({ request, req }) => {
|
|
49
|
+
const agentId = req.params.agentId;
|
|
50
|
+
const threadId = req.params.threadId;
|
|
51
|
+
return require_handle_stop.handleStopAgent({
|
|
52
|
+
runtime,
|
|
53
|
+
request,
|
|
54
|
+
agentId,
|
|
55
|
+
threadId
|
|
56
|
+
});
|
|
57
|
+
}));
|
|
58
|
+
router.get(joinPath(normalizedBase, "/info"), createRouteHandler(runtime, async ({ request }) => {
|
|
59
|
+
return require_get_runtime_info.handleGetRuntimeInfo({
|
|
60
|
+
runtime,
|
|
61
|
+
request
|
|
62
|
+
});
|
|
63
|
+
}));
|
|
64
|
+
router.post(joinPath(normalizedBase, "/transcribe"), createRouteHandler(runtime, async ({ request }) => {
|
|
65
|
+
return require_handle_transcribe.handleTranscribe({
|
|
66
|
+
runtime,
|
|
67
|
+
request
|
|
68
|
+
});
|
|
69
|
+
}));
|
|
70
|
+
router.use(joinPath(normalizedBase, "*"), (req, res) => {
|
|
71
|
+
res.status(404).json({ error: "Not found" });
|
|
72
|
+
});
|
|
73
|
+
return router;
|
|
74
|
+
}
|
|
75
|
+
function createRouteHandler(runtime, factory) {
|
|
76
|
+
return async (req, res, next) => {
|
|
77
|
+
const path = req.originalUrl ?? req.path;
|
|
78
|
+
let request = require_express_utils.createFetchRequestFromExpress(req);
|
|
79
|
+
try {
|
|
80
|
+
const maybeModifiedRequest = await require_middleware.callBeforeRequestMiddleware({
|
|
81
|
+
runtime,
|
|
82
|
+
request,
|
|
83
|
+
path
|
|
84
|
+
});
|
|
85
|
+
if (maybeModifiedRequest) request = maybeModifiedRequest;
|
|
86
|
+
} catch (error) {
|
|
87
|
+
_copilotkitnext_shared.logger.error({
|
|
88
|
+
err: error,
|
|
89
|
+
url: request.url,
|
|
90
|
+
path
|
|
91
|
+
}, "Error running before request middleware");
|
|
92
|
+
if (error instanceof Response) {
|
|
93
|
+
try {
|
|
94
|
+
await require_express_utils.sendFetchResponse(res, error);
|
|
95
|
+
} catch (streamError) {
|
|
96
|
+
next(streamError);
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
next(error);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const response = await factory({
|
|
105
|
+
request,
|
|
106
|
+
req
|
|
107
|
+
});
|
|
108
|
+
await require_express_utils.sendFetchResponse(res, response);
|
|
109
|
+
require_middleware.callAfterRequestMiddleware({
|
|
110
|
+
runtime,
|
|
111
|
+
response,
|
|
112
|
+
path
|
|
113
|
+
}).catch((error) => {
|
|
114
|
+
_copilotkitnext_shared.logger.error({
|
|
115
|
+
err: error,
|
|
116
|
+
url: req.originalUrl ?? req.url,
|
|
117
|
+
path
|
|
118
|
+
}, "Error running after request middleware");
|
|
119
|
+
});
|
|
120
|
+
} catch (error) {
|
|
121
|
+
if (error instanceof Response) {
|
|
122
|
+
try {
|
|
123
|
+
await require_express_utils.sendFetchResponse(res, error);
|
|
124
|
+
} catch (streamError) {
|
|
125
|
+
next(streamError);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
require_middleware.callAfterRequestMiddleware({
|
|
129
|
+
runtime,
|
|
130
|
+
response: error,
|
|
131
|
+
path
|
|
132
|
+
}).catch((mwError) => {
|
|
133
|
+
_copilotkitnext_shared.logger.error({
|
|
134
|
+
err: mwError,
|
|
135
|
+
url: req.originalUrl ?? req.url,
|
|
136
|
+
path
|
|
137
|
+
}, "Error running after request middleware");
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
_copilotkitnext_shared.logger.error({
|
|
142
|
+
err: error,
|
|
143
|
+
url: request.url,
|
|
144
|
+
path
|
|
145
|
+
}, "Error running request handler");
|
|
146
|
+
next(error);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function normalizeBasePath(path) {
|
|
151
|
+
if (!path) throw new Error("basePath must be provided for Express endpoint");
|
|
152
|
+
if (!path.startsWith("/")) return `/${path}`;
|
|
153
|
+
if (path.length > 1 && path.endsWith("/")) return path.slice(0, -1);
|
|
154
|
+
return path;
|
|
155
|
+
}
|
|
156
|
+
function joinPath(basePath, suffix) {
|
|
157
|
+
if (basePath === "/") return suffix.startsWith("/") ? suffix : `/${suffix}`;
|
|
158
|
+
if (!suffix) return basePath;
|
|
159
|
+
if (suffix === "*") return `${basePath}/*`;
|
|
160
|
+
return `${basePath}${suffix.startsWith("/") ? suffix : `/${suffix}`}`;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
//#endregion
|
|
164
|
+
exports.createCopilotEndpointExpress = createCopilotEndpointExpress;
|
|
165
|
+
//# sourceMappingURL=express.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.cjs","names":["handleRunAgent","handleConnectAgent","handleStopAgent","handleGetRuntimeInfo","handleTranscribe","createFetchRequestFromExpress","callBeforeRequestMiddleware","sendFetchResponse"],"sources":["../../src/endpoints/express.ts"],"sourcesContent":["import express from \"express\";\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Router,\n} from \"express\";\nimport cors from \"cors\";\n\nimport { CopilotRuntime } from \"../runtime\";\nimport { handleRunAgent } from \"../handlers/handle-run\";\nimport { handleConnectAgent } from \"../handlers/handle-connect\";\nimport { handleStopAgent } from \"../handlers/handle-stop\";\nimport { handleGetRuntimeInfo } from \"../handlers/get-runtime-info\";\nimport { handleTranscribe } from \"../handlers/handle-transcribe\";\nimport { logger } from \"@copilotkitnext/shared\";\nimport {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"../middleware\";\nimport {\n createFetchRequestFromExpress,\n sendFetchResponse,\n} from \"./express-utils\";\n\ninterface CopilotExpressEndpointParams {\n runtime: CopilotRuntime;\n basePath: string;\n}\n\nexport function createCopilotEndpointExpress({\n runtime,\n basePath,\n}: CopilotExpressEndpointParams): Router {\n const router = express.Router();\n const normalizedBase = normalizeBasePath(basePath);\n\n router.use(\n cors({\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\"*\"],\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/agent/:agentId/run\"),\n createRouteHandler(runtime, async ({ request, req }) => {\n const agentId = req.params.agentId as string;\n return handleRunAgent({ runtime, request, agentId });\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/agent/:agentId/connect\"),\n createRouteHandler(runtime, async ({ request, req }) => {\n const agentId = req.params.agentId as string;\n return handleConnectAgent({ runtime, request, agentId });\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/agent/:agentId/stop/:threadId\"),\n createRouteHandler(runtime, async ({ request, req }) => {\n const agentId = req.params.agentId as string;\n const threadId = req.params.threadId as string;\n return handleStopAgent({ runtime, request, agentId, threadId });\n }),\n );\n\n router.get(\n joinPath(normalizedBase, \"/info\"),\n createRouteHandler(runtime, async ({ request }) => {\n return handleGetRuntimeInfo({ runtime, request });\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/transcribe\"),\n createRouteHandler(runtime, async ({ request }) => {\n return handleTranscribe({ runtime, request });\n }),\n );\n\n router.use(joinPath(normalizedBase, \"*\"), (req, res) => {\n res.status(404).json({ error: \"Not found\" });\n });\n\n return router;\n}\n\ntype RouteHandlerContext = {\n request: Request;\n req: ExpressRequest;\n};\n\ntype RouteHandlerFactory = (ctx: RouteHandlerContext) => Promise<Response>;\n\nfunction createRouteHandler(\n runtime: CopilotRuntime,\n factory: RouteHandlerFactory,\n) {\n return async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction,\n ) => {\n const path = req.originalUrl ?? req.path;\n let request = createFetchRequestFromExpress(req);\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n request = maybeModifiedRequest;\n }\n } catch (error) {\n logger.error(\n { err: error, url: request.url, path },\n \"Error running before request middleware\",\n );\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n next(error);\n return;\n }\n\n try {\n const response = await factory({ request, req });\n await sendFetchResponse(res, response);\n callAfterRequestMiddleware({ runtime, response, path }).catch((error) => {\n logger.error(\n { err: error, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n } catch (error) {\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n return;\n }\n callAfterRequestMiddleware({ runtime, response: error, path }).catch(\n (mwError) => {\n logger.error(\n { err: mwError, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n },\n );\n return;\n }\n logger.error(\n { err: error, url: request.url, path },\n \"Error running request handler\",\n );\n next(error);\n }\n };\n}\n\nfunction normalizeBasePath(path: string): string {\n if (!path) {\n throw new Error(\"basePath must be provided for Express endpoint\");\n }\n\n if (!path.startsWith(\"/\")) {\n return `/${path}`;\n }\n\n if (path.length > 1 && path.endsWith(\"/\")) {\n return path.slice(0, -1);\n }\n\n return path;\n}\n\nfunction joinPath(basePath: string, suffix: string): string {\n if (basePath === \"/\") {\n return suffix.startsWith(\"/\") ? suffix : `/${suffix}`;\n }\n\n if (!suffix) {\n return basePath;\n }\n\n if (suffix === \"*\") {\n return `${basePath}/*`;\n }\n\n return `${basePath}${suffix.startsWith(\"/\") ? suffix : `/${suffix}`}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;AA8BA,SAAgB,6BAA6B,EAC3C,SACA,YACuC;CACvC,MAAM,SAAS,gBAAQ,QAAQ;CAC/B,MAAM,iBAAiB,kBAAkB,SAAS;AAElD,QAAO,sBACA;EACH,QAAQ;EACR,SAAS;GAAC;GAAO;GAAQ;GAAO;GAAQ;GAAU;GAAS;GAAU;EACrE,gBAAgB,CAAC,IAAI;EACtB,CAAC,CACH;AAED,QAAO,KACL,SAAS,gBAAgB,sBAAsB,EAC/C,mBAAmB,SAAS,OAAO,EAAE,SAAS,UAAU;EACtD,MAAM,UAAU,IAAI,OAAO;AAC3B,SAAOA,kCAAe;GAAE;GAAS;GAAS;GAAS,CAAC;GACpD,CACH;AAED,QAAO,KACL,SAAS,gBAAgB,0BAA0B,EACnD,mBAAmB,SAAS,OAAO,EAAE,SAAS,UAAU;EACtD,MAAM,UAAU,IAAI,OAAO;AAC3B,SAAOC,0CAAmB;GAAE;GAAS;GAAS;GAAS,CAAC;GACxD,CACH;AAED,QAAO,KACL,SAAS,gBAAgB,iCAAiC,EAC1D,mBAAmB,SAAS,OAAO,EAAE,SAAS,UAAU;EACtD,MAAM,UAAU,IAAI,OAAO;EAC3B,MAAM,WAAW,IAAI,OAAO;AAC5B,SAAOC,oCAAgB;GAAE;GAAS;GAAS;GAAS;GAAU,CAAC;GAC/D,CACH;AAED,QAAO,IACL,SAAS,gBAAgB,QAAQ,EACjC,mBAAmB,SAAS,OAAO,EAAE,cAAc;AACjD,SAAOC,8CAAqB;GAAE;GAAS;GAAS,CAAC;GACjD,CACH;AAED,QAAO,KACL,SAAS,gBAAgB,cAAc,EACvC,mBAAmB,SAAS,OAAO,EAAE,cAAc;AACjD,SAAOC,2CAAiB;GAAE;GAAS;GAAS,CAAC;GAC7C,CACH;AAED,QAAO,IAAI,SAAS,gBAAgB,IAAI,GAAG,KAAK,QAAQ;AACtD,MAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,aAAa,CAAC;GAC5C;AAEF,QAAO;;AAUT,SAAS,mBACP,SACA,SACA;AACA,QAAO,OACL,KACA,KACA,SACG;EACH,MAAM,OAAO,IAAI,eAAe,IAAI;EACpC,IAAI,UAAUC,oDAA8B,IAAI;AAChD,MAAI;GACF,MAAM,uBAAuB,MAAMC,+CAA4B;IAC7D;IACA;IACA;IACD,CAAC;AACF,OAAI,qBACF,WAAU;WAEL,OAAO;AACd,iCAAO,MACL;IAAE,KAAK;IAAO,KAAK,QAAQ;IAAK;IAAM,EACtC,0CACD;AACD,OAAI,iBAAiB,UAAU;AAC7B,QAAI;AACF,WAAMC,wCAAkB,KAAK,MAAM;aAC5B,aAAa;AACpB,UAAK,YAAY;;AAEnB;;AAEF,QAAK,MAAM;AACX;;AAGF,MAAI;GACF,MAAM,WAAW,MAAM,QAAQ;IAAE;IAAS;IAAK,CAAC;AAChD,SAAMA,wCAAkB,KAAK,SAAS;AACtC,iDAA2B;IAAE;IAAS;IAAU;IAAM,CAAC,CAAC,OAAO,UAAU;AACvE,kCAAO,MACL;KAAE,KAAK;KAAO,KAAK,IAAI,eAAe,IAAI;KAAK;KAAM,EACrD,yCACD;KACD;WACK,OAAO;AACd,OAAI,iBAAiB,UAAU;AAC7B,QAAI;AACF,WAAMA,wCAAkB,KAAK,MAAM;aAC5B,aAAa;AACpB,UAAK,YAAY;AACjB;;AAEF,kDAA2B;KAAE;KAAS,UAAU;KAAO;KAAM,CAAC,CAAC,OAC5D,YAAY;AACX,mCAAO,MACL;MAAE,KAAK;MAAS,KAAK,IAAI,eAAe,IAAI;MAAK;MAAM,EACvD,yCACD;MAEJ;AACD;;AAEF,iCAAO,MACL;IAAE,KAAK;IAAO,KAAK,QAAQ;IAAK;IAAM,EACtC,gCACD;AACD,QAAK,MAAM;;;;AAKjB,SAAS,kBAAkB,MAAsB;AAC/C,KAAI,CAAC,KACH,OAAM,IAAI,MAAM,iDAAiD;AAGnE,KAAI,CAAC,KAAK,WAAW,IAAI,CACvB,QAAO,IAAI;AAGb,KAAI,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI,CACvC,QAAO,KAAK,MAAM,GAAG,GAAG;AAG1B,QAAO;;AAGT,SAAS,SAAS,UAAkB,QAAwB;AAC1D,KAAI,aAAa,IACf,QAAO,OAAO,WAAW,IAAI,GAAG,SAAS,IAAI;AAG/C,KAAI,CAAC,OACH,QAAO;AAGT,KAAI,WAAW,IACb,QAAO,GAAG,SAAS;AAGrB,QAAO,GAAG,WAAW,OAAO,WAAW,IAAI,GAAG,SAAS,IAAI"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CopilotRuntime } from "../runtime.cjs";
|
|
2
|
+
import { Router } from "express";
|
|
3
|
+
|
|
4
|
+
//#region src/endpoints/express.d.ts
|
|
5
|
+
interface CopilotExpressEndpointParams {
|
|
6
|
+
runtime: CopilotRuntime;
|
|
7
|
+
basePath: string;
|
|
8
|
+
}
|
|
9
|
+
declare function createCopilotEndpointExpress({
|
|
10
|
+
runtime,
|
|
11
|
+
basePath
|
|
12
|
+
}: CopilotExpressEndpointParams): Router;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { createCopilotEndpointExpress };
|
|
15
|
+
//# sourceMappingURL=express.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.cts","names":[],"sources":["../../src/endpoints/express.ts"],"mappings":";;;;UAyBU,4BAAA;EACR,OAAA,EAAS,cAAA;EACT,QAAA;AAAA;AAAA,iBAGc,4BAAA,CAAA;EACd,OAAA;EACA;AAAA,GACC,4BAAA,GAA+B,MAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CopilotRuntime } from "../runtime.mjs";
|
|
2
|
+
import { Router } from "express";
|
|
3
|
+
|
|
4
|
+
//#region src/endpoints/express.d.ts
|
|
5
|
+
interface CopilotExpressEndpointParams {
|
|
6
|
+
runtime: CopilotRuntime;
|
|
7
|
+
basePath: string;
|
|
8
|
+
}
|
|
9
|
+
declare function createCopilotEndpointExpress({
|
|
10
|
+
runtime,
|
|
11
|
+
basePath
|
|
12
|
+
}: CopilotExpressEndpointParams): Router;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { createCopilotEndpointExpress };
|
|
15
|
+
//# sourceMappingURL=express.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.d.mts","names":[],"sources":["../../src/endpoints/express.ts"],"mappings":";;;;UAyBU,4BAAA;EACR,OAAA,EAAS,cAAA;EACT,QAAA;AAAA;AAAA,iBAGc,4BAAA,CAAA;EACd,OAAA;EACA;AAAA,GACC,4BAAA,GAA+B,MAAA"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { handleRunAgent } from "../handlers/handle-run.mjs";
|
|
2
|
+
import { handleGetRuntimeInfo } from "../handlers/get-runtime-info.mjs";
|
|
3
|
+
import { handleTranscribe } from "../handlers/handle-transcribe.mjs";
|
|
4
|
+
import { callAfterRequestMiddleware, callBeforeRequestMiddleware } from "../middleware.mjs";
|
|
5
|
+
import { handleConnectAgent } from "../handlers/handle-connect.mjs";
|
|
6
|
+
import { handleStopAgent } from "../handlers/handle-stop.mjs";
|
|
7
|
+
import { createFetchRequestFromExpress, sendFetchResponse } from "./express-utils.mjs";
|
|
8
|
+
import { logger } from "@copilotkitnext/shared";
|
|
9
|
+
import express from "express";
|
|
10
|
+
import cors from "cors";
|
|
11
|
+
|
|
12
|
+
//#region src/endpoints/express.ts
|
|
13
|
+
function createCopilotEndpointExpress({ runtime, basePath }) {
|
|
14
|
+
const router = express.Router();
|
|
15
|
+
const normalizedBase = normalizeBasePath(basePath);
|
|
16
|
+
router.use(cors({
|
|
17
|
+
origin: "*",
|
|
18
|
+
methods: [
|
|
19
|
+
"GET",
|
|
20
|
+
"HEAD",
|
|
21
|
+
"PUT",
|
|
22
|
+
"POST",
|
|
23
|
+
"DELETE",
|
|
24
|
+
"PATCH",
|
|
25
|
+
"OPTIONS"
|
|
26
|
+
],
|
|
27
|
+
allowedHeaders: ["*"]
|
|
28
|
+
}));
|
|
29
|
+
router.post(joinPath(normalizedBase, "/agent/:agentId/run"), createRouteHandler(runtime, async ({ request, req }) => {
|
|
30
|
+
const agentId = req.params.agentId;
|
|
31
|
+
return handleRunAgent({
|
|
32
|
+
runtime,
|
|
33
|
+
request,
|
|
34
|
+
agentId
|
|
35
|
+
});
|
|
36
|
+
}));
|
|
37
|
+
router.post(joinPath(normalizedBase, "/agent/:agentId/connect"), createRouteHandler(runtime, async ({ request, req }) => {
|
|
38
|
+
const agentId = req.params.agentId;
|
|
39
|
+
return handleConnectAgent({
|
|
40
|
+
runtime,
|
|
41
|
+
request,
|
|
42
|
+
agentId
|
|
43
|
+
});
|
|
44
|
+
}));
|
|
45
|
+
router.post(joinPath(normalizedBase, "/agent/:agentId/stop/:threadId"), createRouteHandler(runtime, async ({ request, req }) => {
|
|
46
|
+
const agentId = req.params.agentId;
|
|
47
|
+
const threadId = req.params.threadId;
|
|
48
|
+
return handleStopAgent({
|
|
49
|
+
runtime,
|
|
50
|
+
request,
|
|
51
|
+
agentId,
|
|
52
|
+
threadId
|
|
53
|
+
});
|
|
54
|
+
}));
|
|
55
|
+
router.get(joinPath(normalizedBase, "/info"), createRouteHandler(runtime, async ({ request }) => {
|
|
56
|
+
return handleGetRuntimeInfo({
|
|
57
|
+
runtime,
|
|
58
|
+
request
|
|
59
|
+
});
|
|
60
|
+
}));
|
|
61
|
+
router.post(joinPath(normalizedBase, "/transcribe"), createRouteHandler(runtime, async ({ request }) => {
|
|
62
|
+
return handleTranscribe({
|
|
63
|
+
runtime,
|
|
64
|
+
request
|
|
65
|
+
});
|
|
66
|
+
}));
|
|
67
|
+
router.use(joinPath(normalizedBase, "*"), (req, res) => {
|
|
68
|
+
res.status(404).json({ error: "Not found" });
|
|
69
|
+
});
|
|
70
|
+
return router;
|
|
71
|
+
}
|
|
72
|
+
function createRouteHandler(runtime, factory) {
|
|
73
|
+
return async (req, res, next) => {
|
|
74
|
+
const path = req.originalUrl ?? req.path;
|
|
75
|
+
let request = createFetchRequestFromExpress(req);
|
|
76
|
+
try {
|
|
77
|
+
const maybeModifiedRequest = await callBeforeRequestMiddleware({
|
|
78
|
+
runtime,
|
|
79
|
+
request,
|
|
80
|
+
path
|
|
81
|
+
});
|
|
82
|
+
if (maybeModifiedRequest) request = maybeModifiedRequest;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
logger.error({
|
|
85
|
+
err: error,
|
|
86
|
+
url: request.url,
|
|
87
|
+
path
|
|
88
|
+
}, "Error running before request middleware");
|
|
89
|
+
if (error instanceof Response) {
|
|
90
|
+
try {
|
|
91
|
+
await sendFetchResponse(res, error);
|
|
92
|
+
} catch (streamError) {
|
|
93
|
+
next(streamError);
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
next(error);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const response = await factory({
|
|
102
|
+
request,
|
|
103
|
+
req
|
|
104
|
+
});
|
|
105
|
+
await sendFetchResponse(res, response);
|
|
106
|
+
callAfterRequestMiddleware({
|
|
107
|
+
runtime,
|
|
108
|
+
response,
|
|
109
|
+
path
|
|
110
|
+
}).catch((error) => {
|
|
111
|
+
logger.error({
|
|
112
|
+
err: error,
|
|
113
|
+
url: req.originalUrl ?? req.url,
|
|
114
|
+
path
|
|
115
|
+
}, "Error running after request middleware");
|
|
116
|
+
});
|
|
117
|
+
} catch (error) {
|
|
118
|
+
if (error instanceof Response) {
|
|
119
|
+
try {
|
|
120
|
+
await sendFetchResponse(res, error);
|
|
121
|
+
} catch (streamError) {
|
|
122
|
+
next(streamError);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
callAfterRequestMiddleware({
|
|
126
|
+
runtime,
|
|
127
|
+
response: error,
|
|
128
|
+
path
|
|
129
|
+
}).catch((mwError) => {
|
|
130
|
+
logger.error({
|
|
131
|
+
err: mwError,
|
|
132
|
+
url: req.originalUrl ?? req.url,
|
|
133
|
+
path
|
|
134
|
+
}, "Error running after request middleware");
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
logger.error({
|
|
139
|
+
err: error,
|
|
140
|
+
url: request.url,
|
|
141
|
+
path
|
|
142
|
+
}, "Error running request handler");
|
|
143
|
+
next(error);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function normalizeBasePath(path) {
|
|
148
|
+
if (!path) throw new Error("basePath must be provided for Express endpoint");
|
|
149
|
+
if (!path.startsWith("/")) return `/${path}`;
|
|
150
|
+
if (path.length > 1 && path.endsWith("/")) return path.slice(0, -1);
|
|
151
|
+
return path;
|
|
152
|
+
}
|
|
153
|
+
function joinPath(basePath, suffix) {
|
|
154
|
+
if (basePath === "/") return suffix.startsWith("/") ? suffix : `/${suffix}`;
|
|
155
|
+
if (!suffix) return basePath;
|
|
156
|
+
if (suffix === "*") return `${basePath}/*`;
|
|
157
|
+
return `${basePath}${suffix.startsWith("/") ? suffix : `/${suffix}`}`;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
//#endregion
|
|
161
|
+
export { createCopilotEndpointExpress };
|
|
162
|
+
//# sourceMappingURL=express.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express.mjs","names":[],"sources":["../../src/endpoints/express.ts"],"sourcesContent":["import express from \"express\";\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Router,\n} from \"express\";\nimport cors from \"cors\";\n\nimport { CopilotRuntime } from \"../runtime\";\nimport { handleRunAgent } from \"../handlers/handle-run\";\nimport { handleConnectAgent } from \"../handlers/handle-connect\";\nimport { handleStopAgent } from \"../handlers/handle-stop\";\nimport { handleGetRuntimeInfo } from \"../handlers/get-runtime-info\";\nimport { handleTranscribe } from \"../handlers/handle-transcribe\";\nimport { logger } from \"@copilotkitnext/shared\";\nimport {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"../middleware\";\nimport {\n createFetchRequestFromExpress,\n sendFetchResponse,\n} from \"./express-utils\";\n\ninterface CopilotExpressEndpointParams {\n runtime: CopilotRuntime;\n basePath: string;\n}\n\nexport function createCopilotEndpointExpress({\n runtime,\n basePath,\n}: CopilotExpressEndpointParams): Router {\n const router = express.Router();\n const normalizedBase = normalizeBasePath(basePath);\n\n router.use(\n cors({\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\"*\"],\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/agent/:agentId/run\"),\n createRouteHandler(runtime, async ({ request, req }) => {\n const agentId = req.params.agentId as string;\n return handleRunAgent({ runtime, request, agentId });\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/agent/:agentId/connect\"),\n createRouteHandler(runtime, async ({ request, req }) => {\n const agentId = req.params.agentId as string;\n return handleConnectAgent({ runtime, request, agentId });\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/agent/:agentId/stop/:threadId\"),\n createRouteHandler(runtime, async ({ request, req }) => {\n const agentId = req.params.agentId as string;\n const threadId = req.params.threadId as string;\n return handleStopAgent({ runtime, request, agentId, threadId });\n }),\n );\n\n router.get(\n joinPath(normalizedBase, \"/info\"),\n createRouteHandler(runtime, async ({ request }) => {\n return handleGetRuntimeInfo({ runtime, request });\n }),\n );\n\n router.post(\n joinPath(normalizedBase, \"/transcribe\"),\n createRouteHandler(runtime, async ({ request }) => {\n return handleTranscribe({ runtime, request });\n }),\n );\n\n router.use(joinPath(normalizedBase, \"*\"), (req, res) => {\n res.status(404).json({ error: \"Not found\" });\n });\n\n return router;\n}\n\ntype RouteHandlerContext = {\n request: Request;\n req: ExpressRequest;\n};\n\ntype RouteHandlerFactory = (ctx: RouteHandlerContext) => Promise<Response>;\n\nfunction createRouteHandler(\n runtime: CopilotRuntime,\n factory: RouteHandlerFactory,\n) {\n return async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction,\n ) => {\n const path = req.originalUrl ?? req.path;\n let request = createFetchRequestFromExpress(req);\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n request = maybeModifiedRequest;\n }\n } catch (error) {\n logger.error(\n { err: error, url: request.url, path },\n \"Error running before request middleware\",\n );\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n next(error);\n return;\n }\n\n try {\n const response = await factory({ request, req });\n await sendFetchResponse(res, response);\n callAfterRequestMiddleware({ runtime, response, path }).catch((error) => {\n logger.error(\n { err: error, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n } catch (error) {\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n return;\n }\n callAfterRequestMiddleware({ runtime, response: error, path }).catch(\n (mwError) => {\n logger.error(\n { err: mwError, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n },\n );\n return;\n }\n logger.error(\n { err: error, url: request.url, path },\n \"Error running request handler\",\n );\n next(error);\n }\n };\n}\n\nfunction normalizeBasePath(path: string): string {\n if (!path) {\n throw new Error(\"basePath must be provided for Express endpoint\");\n }\n\n if (!path.startsWith(\"/\")) {\n return `/${path}`;\n }\n\n if (path.length > 1 && path.endsWith(\"/\")) {\n return path.slice(0, -1);\n }\n\n return path;\n}\n\nfunction joinPath(basePath: string, suffix: string): string {\n if (basePath === \"/\") {\n return suffix.startsWith(\"/\") ? suffix : `/${suffix}`;\n }\n\n if (!suffix) {\n return basePath;\n }\n\n if (suffix === \"*\") {\n return `${basePath}/*`;\n }\n\n return `${basePath}${suffix.startsWith(\"/\") ? suffix : `/${suffix}`}`;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_handle_run = require('../handlers/handle-run.cjs');
|
|
3
|
+
const require_get_runtime_info = require('../handlers/get-runtime-info.cjs');
|
|
4
|
+
const require_handle_transcribe = require('../handlers/handle-transcribe.cjs');
|
|
5
|
+
const require_middleware = require('../middleware.cjs');
|
|
6
|
+
const require_handle_connect = require('../handlers/handle-connect.cjs');
|
|
7
|
+
const require_handle_stop = require('../handlers/handle-stop.cjs');
|
|
8
|
+
const require_single_route_helpers = require('./single-route-helpers.cjs');
|
|
9
|
+
let _copilotkitnext_shared = require("@copilotkitnext/shared");
|
|
10
|
+
let hono = require("hono");
|
|
11
|
+
let hono_cors = require("hono/cors");
|
|
12
|
+
|
|
13
|
+
//#region src/endpoints/hono-single.ts
|
|
14
|
+
function createCopilotEndpointSingleRoute({ runtime, basePath, cors: corsConfig }) {
|
|
15
|
+
const app = new hono.Hono();
|
|
16
|
+
const routePath = normalizePath(basePath);
|
|
17
|
+
return app.basePath(routePath).use("*", (0, hono_cors.cors)({
|
|
18
|
+
origin: corsConfig?.origin ?? "*",
|
|
19
|
+
allowMethods: [
|
|
20
|
+
"GET",
|
|
21
|
+
"HEAD",
|
|
22
|
+
"PUT",
|
|
23
|
+
"POST",
|
|
24
|
+
"DELETE",
|
|
25
|
+
"PATCH",
|
|
26
|
+
"OPTIONS"
|
|
27
|
+
],
|
|
28
|
+
allowHeaders: ["*"],
|
|
29
|
+
credentials: corsConfig?.credentials ?? false
|
|
30
|
+
})).use("*", async (c, next) => {
|
|
31
|
+
const request = c.req.raw;
|
|
32
|
+
const path = c.req.path;
|
|
33
|
+
try {
|
|
34
|
+
const maybeModifiedRequest = await require_middleware.callBeforeRequestMiddleware({
|
|
35
|
+
runtime,
|
|
36
|
+
request,
|
|
37
|
+
path
|
|
38
|
+
});
|
|
39
|
+
if (maybeModifiedRequest) c.set("modifiedRequest", maybeModifiedRequest);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
_copilotkitnext_shared.logger.error({
|
|
42
|
+
err: error,
|
|
43
|
+
url: request.url,
|
|
44
|
+
path
|
|
45
|
+
}, "Error running before request middleware");
|
|
46
|
+
if (error instanceof Response) return error;
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
await next();
|
|
50
|
+
}).use("*", async (c, next) => {
|
|
51
|
+
await next();
|
|
52
|
+
const response = c.res;
|
|
53
|
+
const path = c.req.path;
|
|
54
|
+
require_middleware.callAfterRequestMiddleware({
|
|
55
|
+
runtime,
|
|
56
|
+
response,
|
|
57
|
+
path
|
|
58
|
+
}).catch((error) => {
|
|
59
|
+
_copilotkitnext_shared.logger.error({
|
|
60
|
+
err: error,
|
|
61
|
+
url: c.req.url,
|
|
62
|
+
path
|
|
63
|
+
}, "Error running after request middleware");
|
|
64
|
+
});
|
|
65
|
+
}).post("/", async (c) => {
|
|
66
|
+
const request = c.get("modifiedRequest") || c.req.raw;
|
|
67
|
+
let methodCall;
|
|
68
|
+
try {
|
|
69
|
+
methodCall = await require_single_route_helpers.parseMethodCall(request);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
if (error instanceof Response) {
|
|
72
|
+
_copilotkitnext_shared.logger.warn({ url: request.url }, "Invalid single-route payload");
|
|
73
|
+
return error;
|
|
74
|
+
}
|
|
75
|
+
_copilotkitnext_shared.logger.warn({
|
|
76
|
+
err: error,
|
|
77
|
+
url: request.url
|
|
78
|
+
}, "Invalid single-route payload");
|
|
79
|
+
return c.json({
|
|
80
|
+
error: "invalid_request",
|
|
81
|
+
message: error instanceof Error ? error.message : "Invalid request payload"
|
|
82
|
+
}, 400);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
switch (methodCall.method) {
|
|
86
|
+
case "agent/run": {
|
|
87
|
+
const agentId = require_single_route_helpers.expectString(methodCall.params, "agentId");
|
|
88
|
+
return await require_handle_run.handleRunAgent({
|
|
89
|
+
runtime,
|
|
90
|
+
request: require_single_route_helpers.createJsonRequest(request, methodCall.body),
|
|
91
|
+
agentId
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
case "agent/connect": {
|
|
95
|
+
const agentId = require_single_route_helpers.expectString(methodCall.params, "agentId");
|
|
96
|
+
return await require_handle_connect.handleConnectAgent({
|
|
97
|
+
runtime,
|
|
98
|
+
request: require_single_route_helpers.createJsonRequest(request, methodCall.body),
|
|
99
|
+
agentId
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
case "agent/stop": return await require_handle_stop.handleStopAgent({
|
|
103
|
+
runtime,
|
|
104
|
+
request,
|
|
105
|
+
agentId: require_single_route_helpers.expectString(methodCall.params, "agentId"),
|
|
106
|
+
threadId: require_single_route_helpers.expectString(methodCall.params, "threadId")
|
|
107
|
+
});
|
|
108
|
+
case "info": return await require_get_runtime_info.handleGetRuntimeInfo({
|
|
109
|
+
runtime,
|
|
110
|
+
request
|
|
111
|
+
});
|
|
112
|
+
case "transcribe": return await require_handle_transcribe.handleTranscribe({
|
|
113
|
+
runtime,
|
|
114
|
+
request: require_single_route_helpers.createJsonRequest(request, methodCall.body)
|
|
115
|
+
});
|
|
116
|
+
default: return methodCall.method;
|
|
117
|
+
}
|
|
118
|
+
} catch (error) {
|
|
119
|
+
if (error instanceof Response) return error;
|
|
120
|
+
_copilotkitnext_shared.logger.error({
|
|
121
|
+
err: error,
|
|
122
|
+
url: request.url,
|
|
123
|
+
method: methodCall.method
|
|
124
|
+
}, "Error running single-route handler");
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}).notFound((c) => {
|
|
128
|
+
return c.json({ error: "Not found" }, 404);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function normalizePath(path) {
|
|
132
|
+
if (!path) throw new Error("basePath must be provided for single-route endpoint");
|
|
133
|
+
if (!path.startsWith("/")) return `/${path}`;
|
|
134
|
+
if (path.length > 1 && path.endsWith("/")) return path.slice(0, -1);
|
|
135
|
+
return path;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
//#endregion
|
|
139
|
+
exports.createCopilotEndpointSingleRoute = createCopilotEndpointSingleRoute;
|
|
140
|
+
//# sourceMappingURL=hono-single.cjs.map
|