@copilotkitnext/runtime 1.51.4-next.7 → 1.51.4
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/{chunk-O6YC5CJ6.mjs → chunk-5GKH3W25.mjs} +20 -8
- package/dist/chunk-5GKH3W25.mjs.map +1 -0
- package/dist/express.d.mts +1 -1
- package/dist/express.d.ts +1 -1
- package/dist/express.js +148 -57
- package/dist/express.js.map +1 -1
- package/dist/express.mjs +130 -51
- package/dist/express.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +107 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +89 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -6
- package/.cursor/rules/runtime.always.mdc +0 -9
- package/dist/chunk-O6YC5CJ6.mjs.map +0 -1
|
@@ -274,7 +274,7 @@ var InMemoryAgentRunner = class extends AgentRunner {
|
|
|
274
274
|
// package.json
|
|
275
275
|
var package_default = {
|
|
276
276
|
name: "@copilotkitnext/runtime",
|
|
277
|
-
version: "1.51.4
|
|
277
|
+
version: "1.51.4",
|
|
278
278
|
description: "Server-side runtime package for CopilotKit2",
|
|
279
279
|
main: "dist/index.js",
|
|
280
280
|
types: "dist/index.d.ts",
|
|
@@ -298,7 +298,6 @@ var package_default = {
|
|
|
298
298
|
dev: "tsup --watch",
|
|
299
299
|
lint: "eslint .",
|
|
300
300
|
"check-types": "tsc --noEmit",
|
|
301
|
-
clean: "rm -rf dist",
|
|
302
301
|
test: "vitest run",
|
|
303
302
|
"test:watch": "vitest",
|
|
304
303
|
"test:coverage": "vitest run --coverage"
|
|
@@ -813,7 +812,10 @@ async function extractAudioFromFormData(request) {
|
|
|
813
812
|
return { error: createErrorResponse(err) };
|
|
814
813
|
}
|
|
815
814
|
if (!isValidAudioType(audioFile.type)) {
|
|
816
|
-
const err = TranscriptionErrors.invalidAudioFormat(
|
|
815
|
+
const err = TranscriptionErrors.invalidAudioFormat(
|
|
816
|
+
audioFile.type,
|
|
817
|
+
VALID_AUDIO_TYPES
|
|
818
|
+
);
|
|
817
819
|
return { error: createErrorResponse(err) };
|
|
818
820
|
}
|
|
819
821
|
return { file: audioFile };
|
|
@@ -823,7 +825,9 @@ async function extractAudioFromJson(request) {
|
|
|
823
825
|
try {
|
|
824
826
|
body = await request.json();
|
|
825
827
|
} catch {
|
|
826
|
-
const err = TranscriptionErrors.invalidRequest(
|
|
828
|
+
const err = TranscriptionErrors.invalidRequest(
|
|
829
|
+
"Request body must be valid JSON"
|
|
830
|
+
);
|
|
827
831
|
return { error: createErrorResponse(err) };
|
|
828
832
|
}
|
|
829
833
|
if (!body.audio || typeof body.audio !== "string") {
|
|
@@ -839,7 +843,10 @@ async function extractAudioFromJson(request) {
|
|
|
839
843
|
return { error: createErrorResponse(err) };
|
|
840
844
|
}
|
|
841
845
|
if (!isValidAudioType(body.mimeType)) {
|
|
842
|
-
const err = TranscriptionErrors.invalidAudioFormat(
|
|
846
|
+
const err = TranscriptionErrors.invalidAudioFormat(
|
|
847
|
+
body.mimeType,
|
|
848
|
+
VALID_AUDIO_TYPES
|
|
849
|
+
);
|
|
843
850
|
return { error: createErrorResponse(err) };
|
|
844
851
|
}
|
|
845
852
|
try {
|
|
@@ -847,7 +854,9 @@ async function extractAudioFromJson(request) {
|
|
|
847
854
|
const file = base64ToFile(body.audio, body.mimeType, filename);
|
|
848
855
|
return { file };
|
|
849
856
|
} catch {
|
|
850
|
-
const err = TranscriptionErrors.invalidRequest(
|
|
857
|
+
const err = TranscriptionErrors.invalidRequest(
|
|
858
|
+
"Failed to decode base64 audio data"
|
|
859
|
+
);
|
|
851
860
|
return { error: createErrorResponse(err) };
|
|
852
861
|
}
|
|
853
862
|
}
|
|
@@ -950,7 +959,10 @@ var METHOD_NAMES = [
|
|
|
950
959
|
async function parseMethodCall(request) {
|
|
951
960
|
const contentType = request.headers.get("content-type") || "";
|
|
952
961
|
if (!contentType.includes("application/json")) {
|
|
953
|
-
throw createResponseError(
|
|
962
|
+
throw createResponseError(
|
|
963
|
+
"Single-route endpoint expects JSON payloads",
|
|
964
|
+
415
|
|
965
|
+
);
|
|
954
966
|
}
|
|
955
967
|
let jsonEnvelope;
|
|
956
968
|
try {
|
|
@@ -1039,4 +1051,4 @@ export {
|
|
|
1039
1051
|
expectString,
|
|
1040
1052
|
createJsonRequest
|
|
1041
1053
|
};
|
|
1042
|
-
//# sourceMappingURL=chunk-
|
|
1054
|
+
//# sourceMappingURL=chunk-5GKH3W25.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runner/agent-runner.ts","../src/runner/in-memory.ts","../package.json","../src/runtime.ts","../src/handlers/handle-run.ts","../src/handlers/header-utils.ts","../src/handlers/handle-connect.ts","../src/handlers/handle-stop.ts","../src/handlers/get-runtime-info.ts","../src/handlers/handle-transcribe.ts","../src/middleware.ts","../src/endpoints/single-route-helpers.ts"],"sourcesContent":["import { AbstractAgent, BaseEvent, RunAgentInput } from \"@ag-ui/client\";\nimport { Observable } from \"rxjs\";\n\nexport interface AgentRunnerRunRequest {\n threadId: string;\n agent: AbstractAgent;\n input: RunAgentInput;\n}\n\nexport interface AgentRunnerConnectRequest {\n threadId: string;\n headers?: Record<string, string>;\n}\n\nexport interface AgentRunnerIsRunningRequest {\n threadId: string;\n}\n\nexport interface AgentRunnerStopRequest {\n threadId: string;\n}\n\nexport abstract class AgentRunner {\n abstract run(request: AgentRunnerRunRequest): Observable<BaseEvent>;\n abstract connect(request: AgentRunnerConnectRequest): Observable<BaseEvent>;\n abstract isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean>;\n abstract stop(request: AgentRunnerStopRequest): Promise<boolean | undefined>;\n}\n","import {\n AgentRunner,\n AgentRunnerConnectRequest,\n AgentRunnerIsRunningRequest,\n AgentRunnerRunRequest,\n type AgentRunnerStopRequest,\n} from \"./agent-runner\";\nimport { Observable, ReplaySubject } from \"rxjs\";\nimport {\n AbstractAgent,\n BaseEvent,\n EventType,\n MessagesSnapshotEvent,\n RunStartedEvent,\n compactEvents,\n} from \"@ag-ui/client\";\nimport { finalizeRunEvents } from \"@copilotkitnext/shared\";\n\ninterface HistoricRun {\n threadId: string;\n runId: string;\n parentRunId: string | null;\n events: BaseEvent[];\n createdAt: number;\n}\n\nclass InMemoryEventStore {\n constructor(public threadId: string) {}\n\n /** The subject that current consumers subscribe to. */\n subject: ReplaySubject<BaseEvent> | null = null;\n\n /** True while a run is actively producing events. */\n isRunning = false;\n\n /** Current run ID */\n currentRunId: string | null = null;\n\n /** Historic completed runs */\n historicRuns: HistoricRun[] = [];\n\n /** Currently running agent instance (if any). */\n agent: AbstractAgent | null = null;\n\n /** Subject returned from run() while the run is active. */\n runSubject: ReplaySubject<BaseEvent> | null = null;\n\n /** True once stop() has been requested but the run has not yet finalized. */\n stopRequested = false;\n\n /** Reference to the events emitted in the current run. */\n currentEvents: BaseEvent[] | null = null;\n}\n\n// Use a symbol key on globalThis to survive hot reloads in development\nconst GLOBAL_STORE_KEY = Symbol.for(\"@copilotkitnext/runtime/in-memory-store\");\n\ninterface GlobalStoreData {\n stores: Map<string, InMemoryEventStore>;\n historicRunsBackup: Map<string, HistoricRun[]>;\n}\n\nfunction getGlobalStore(): Map<string, InMemoryEventStore> {\n const globalAny = globalThis as unknown as Record<symbol, GlobalStoreData>;\n\n if (!globalAny[GLOBAL_STORE_KEY]) {\n globalAny[GLOBAL_STORE_KEY] = {\n stores: new Map<string, InMemoryEventStore>(),\n historicRunsBackup: new Map<string, HistoricRun[]>(),\n };\n }\n\n const data = globalAny[GLOBAL_STORE_KEY];\n\n // Restore historic runs from backup after hot reload\n // (when stores map is empty but backup has data)\n if (data.stores.size === 0 && data.historicRunsBackup.size > 0) {\n for (const [threadId, historicRuns] of data.historicRunsBackup) {\n const store = new InMemoryEventStore(threadId);\n store.historicRuns = historicRuns;\n data.stores.set(threadId, store);\n }\n }\n\n return data.stores;\n}\n\nfunction backupHistoricRuns(\n threadId: string,\n historicRuns: HistoricRun[],\n): void {\n const globalAny = globalThis as unknown as Record<symbol, GlobalStoreData>;\n if (globalAny[GLOBAL_STORE_KEY]) {\n globalAny[GLOBAL_STORE_KEY].historicRunsBackup.set(threadId, historicRuns);\n }\n}\n\nconst GLOBAL_STORE = getGlobalStore();\n\nexport class InMemoryAgentRunner extends AgentRunner {\n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n let existingStore = GLOBAL_STORE.get(request.threadId);\n if (!existingStore) {\n existingStore = new InMemoryEventStore(request.threadId);\n GLOBAL_STORE.set(request.threadId, existingStore);\n }\n const store = existingStore; // Now store is const and non-null\n\n if (store.isRunning) {\n throw new Error(\"Thread already running\");\n }\n store.isRunning = true;\n store.currentRunId = request.input.runId;\n store.agent = request.agent;\n store.stopRequested = false;\n\n // Track seen message IDs and current run events for this run\n const seenMessageIds = new Set<string>();\n const currentRunEvents: BaseEvent[] = [];\n store.currentEvents = currentRunEvents;\n\n // Get all previously seen message IDs from historic runs\n const historicMessageIds = new Set<string>();\n for (const run of store.historicRuns) {\n for (const event of run.events) {\n if (\"messageId\" in event && typeof event.messageId === \"string\") {\n historicMessageIds.add(event.messageId);\n }\n if (event.type === EventType.RUN_STARTED) {\n const runStarted = event as RunStartedEvent;\n const messages = runStarted.input?.messages ?? [];\n for (const message of messages) {\n historicMessageIds.add(message.id);\n }\n }\n }\n }\n\n const nextSubject = new ReplaySubject<BaseEvent>(Infinity);\n const prevSubject = store.subject;\n\n // Update the store's subject immediately\n store.subject = nextSubject;\n\n // Create a subject for run() return value\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\n store.runSubject = runSubject;\n\n // Helper function to run the agent and handle errors\n const runAgent = async () => {\n // Get parent run ID for chaining\n const lastRun = store.historicRuns[store.historicRuns.length - 1];\n const parentRunId = lastRun?.runId ?? null;\n\n try {\n await request.agent.runAgent(request.input, {\n onEvent: ({ event }) => {\n let processedEvent: BaseEvent = event;\n if (event.type === EventType.RUN_STARTED) {\n const runStartedEvent = event as RunStartedEvent;\n if (!runStartedEvent.input) {\n const sanitizedMessages = request.input.messages\n ? request.input.messages.filter(\n (message) => !historicMessageIds.has(message.id),\n )\n : undefined;\n const updatedInput = {\n ...request.input,\n ...(sanitizedMessages !== undefined\n ? { messages: sanitizedMessages }\n : {}),\n };\n processedEvent = {\n ...runStartedEvent,\n input: updatedInput,\n } as RunStartedEvent;\n }\n }\n\n runSubject.next(processedEvent); // For run() return - only agent events\n nextSubject.next(processedEvent); // For connect() / store - all events\n currentRunEvents.push(processedEvent); // Accumulate for storage\n },\n onNewMessage: ({ message }) => {\n // Called for each new message\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n },\n onRunStartedEvent: () => {\n // Mark any messages from the input as seen so they aren't emitted twice\n if (request.input.messages) {\n for (const message of request.input.messages) {\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n }\n }\n },\n });\n\n const appendedEvents = finalizeRunEvents(currentRunEvents, {\n stopRequested: store.stopRequested,\n });\n for (const event of appendedEvents) {\n runSubject.next(event);\n nextSubject.next(event);\n }\n\n // Store the completed run in memory with ONLY its events\n if (store.currentRunId) {\n // Compact the events before storing (like SQLite does)\n const compactedEvents = compactEvents(currentRunEvents);\n\n store.historicRuns.push({\n threadId: request.threadId,\n runId: store.currentRunId,\n parentRunId,\n events: compactedEvents,\n createdAt: Date.now(),\n });\n\n // Backup for hot reload survival\n backupHistoricRuns(request.threadId, store.historicRuns);\n }\n\n // Complete the run\n store.currentEvents = null;\n store.currentRunId = null;\n store.agent = null;\n store.runSubject = null;\n store.stopRequested = false;\n store.isRunning = false;\n runSubject.complete();\n nextSubject.complete();\n } catch (error) {\n const interruptionMessage =\n error instanceof Error ? error.message : String(error);\n const appendedEvents = finalizeRunEvents(currentRunEvents, {\n stopRequested: store.stopRequested,\n interruptionMessage,\n });\n for (const event of appendedEvents) {\n runSubject.next(event);\n nextSubject.next(event);\n }\n\n // Store the run even if it failed (partial events)\n if (store.currentRunId && currentRunEvents.length > 0) {\n // Compact the events before storing (like SQLite does)\n const compactedEvents = compactEvents(currentRunEvents);\n store.historicRuns.push({\n threadId: request.threadId,\n runId: store.currentRunId,\n parentRunId,\n events: compactedEvents,\n createdAt: Date.now(),\n });\n\n // Backup for hot reload survival\n backupHistoricRuns(request.threadId, store.historicRuns);\n }\n\n // Complete the run\n store.currentEvents = null;\n store.currentRunId = null;\n store.agent = null;\n store.runSubject = null;\n store.stopRequested = false;\n store.isRunning = false;\n runSubject.complete();\n nextSubject.complete();\n }\n };\n\n // Bridge previous events if they exist\n if (prevSubject) {\n prevSubject.subscribe({\n next: (e) => nextSubject.next(e),\n error: (err) => nextSubject.error(err),\n complete: () => {\n // Don't complete nextSubject here - it needs to stay open for new events\n },\n });\n }\n\n // Start the agent execution immediately (not lazily)\n runAgent();\n\n // Return the run subject (only agent events, no injected messages)\n return runSubject.asObservable();\n }\n\n connect(request: AgentRunnerConnectRequest): Observable<BaseEvent> {\n const store = GLOBAL_STORE.get(request.threadId);\n const connectionSubject = new ReplaySubject<BaseEvent>(Infinity);\n\n if (!store) {\n // No store means no events\n connectionSubject.complete();\n return connectionSubject.asObservable();\n }\n\n // Collect all historic events from memory\n const allHistoricEvents: BaseEvent[] = [];\n for (const run of store.historicRuns) {\n allHistoricEvents.push(...run.events);\n }\n\n // Apply compaction to all historic events together (like SQLite)\n const compactedEvents = compactEvents(allHistoricEvents);\n\n // Emit compacted events and track message IDs\n const emittedMessageIds = new Set<string>();\n for (const event of compactedEvents) {\n connectionSubject.next(event);\n if (\"messageId\" in event && typeof event.messageId === \"string\") {\n emittedMessageIds.add(event.messageId);\n }\n }\n\n // Bridge active run to connection if exists\n if (store.subject && (store.isRunning || store.stopRequested)) {\n store.subject.subscribe({\n next: (event) => {\n // Skip message events that we've already emitted from historic\n if (\n \"messageId\" in event &&\n typeof event.messageId === \"string\" &&\n emittedMessageIds.has(event.messageId)\n ) {\n return;\n }\n connectionSubject.next(event);\n },\n complete: () => connectionSubject.complete(),\n error: (err) => connectionSubject.error(err),\n });\n } else {\n // No active run, complete after historic events\n connectionSubject.complete();\n }\n\n return connectionSubject.asObservable();\n }\n\n isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean> {\n const store = GLOBAL_STORE.get(request.threadId);\n return Promise.resolve(store?.isRunning ?? false);\n }\n\n stop(request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n const store = GLOBAL_STORE.get(request.threadId);\n if (!store || !store.isRunning) {\n return Promise.resolve(false);\n }\n if (store.stopRequested) {\n return Promise.resolve(false);\n }\n\n store.stopRequested = true;\n store.isRunning = false;\n\n const agent = store.agent;\n if (!agent) {\n store.stopRequested = false;\n store.isRunning = false;\n return Promise.resolve(false);\n }\n\n try {\n agent.abortRun();\n return Promise.resolve(true);\n } catch (error) {\n console.error(\"Failed to abort agent run\", error);\n store.stopRequested = false;\n store.isRunning = true;\n return Promise.resolve(false);\n }\n }\n}\n","{\n \"name\": \"@copilotkitnext/runtime\",\n \"version\": \"1.51.4\",\n \"description\": \"Server-side runtime package for CopilotKit2\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n },\n \"./express\": {\n \"types\": \"./dist/express.d.ts\",\n \"import\": \"./dist/express.mjs\",\n \"require\": \"./dist/express.js\"\n }\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint .\",\n \"check-types\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\"\n },\n \"devDependencies\": {\n \"@copilotkitnext/eslint-config\": \"workspace:*\",\n \"@copilotkitnext/typescript-config\": \"workspace:*\",\n \"@types/cors\": \"^2.8.17\",\n \"@types/express\": \"^4.17.21\",\n \"@types/node\": \"^22.15.3\",\n \"eslint\": \"^9.30.0\",\n \"supertest\": \"^7.1.1\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"5.8.2\",\n \"vitest\": \"^3.0.5\"\n },\n \"dependencies\": {\n \"@ag-ui/client\": \"0.0.42\",\n \"@ag-ui/core\": \"0.0.42\",\n \"@ag-ui/encoder\": \"0.0.42\",\n \"@copilotkitnext/shared\": \"workspace:*\",\n \"cors\": \"^2.8.5\",\n \"express\": \"^4.21.2\",\n \"hono\": \"^4.11.4\",\n \"rxjs\": \"7.8.1\"\n },\n \"peerDependencies\": {\n \"@ag-ui/client\": \"0.0.42\",\n \"@ag-ui/core\": \"0.0.42\",\n \"@ag-ui/encoder\": \"0.0.42\",\n \"@copilotkitnext/shared\": \"workspace:*\"\n },\n \"peerDependenciesMeta\": {},\n \"engines\": {\n \"node\": \">=18\"\n }\n}\n","import { MaybePromise, NonEmptyRecord } from \"@copilotkitnext/shared\";\nimport { AbstractAgent } from \"@ag-ui/client\";\nimport pkg from \"../package.json\";\nimport type {\n BeforeRequestMiddleware,\n AfterRequestMiddleware,\n} from \"./middleware\";\nimport { TranscriptionService } from \"./transcription-service/transcription-service\";\nimport { AgentRunner } from \"./runner/agent-runner\";\nimport { InMemoryAgentRunner } from \"./runner/in-memory\";\n\nexport const VERSION = pkg.version;\n\n/**\n * Options used to construct a `CopilotRuntime` instance.\n */\nexport interface CopilotRuntimeOptions {\n /** Map of available agents (loaded lazily is fine). */\n agents: MaybePromise<NonEmptyRecord<Record<string, AbstractAgent>>>;\n /** The runner to use for running agents. */\n runner?: AgentRunner;\n /** Optional transcription service for audio processing. */\n transcriptionService?: TranscriptionService;\n /** Optional *before* middleware – callback function or webhook URL. */\n beforeRequestMiddleware?: BeforeRequestMiddleware;\n /** Optional *after* middleware – callback function or webhook URL. */\n afterRequestMiddleware?: AfterRequestMiddleware;\n}\n\n/**\n * Central runtime object passed to all request handlers.\n */\nexport class CopilotRuntime {\n public agents: CopilotRuntimeOptions[\"agents\"];\n public transcriptionService: CopilotRuntimeOptions[\"transcriptionService\"];\n public beforeRequestMiddleware: CopilotRuntimeOptions[\"beforeRequestMiddleware\"];\n public afterRequestMiddleware: CopilotRuntimeOptions[\"afterRequestMiddleware\"];\n public runner: AgentRunner;\n\n constructor({\n agents,\n transcriptionService,\n beforeRequestMiddleware,\n afterRequestMiddleware,\n runner,\n }: CopilotRuntimeOptions) {\n this.agents = agents;\n this.transcriptionService = transcriptionService;\n this.beforeRequestMiddleware = beforeRequestMiddleware;\n this.afterRequestMiddleware = afterRequestMiddleware;\n this.runner = runner ?? new InMemoryAgentRunner();\n }\n}\n","import {\n AbstractAgent,\n HttpAgent,\n RunAgentInput,\n RunAgentInputSchema,\n} from \"@ag-ui/client\";\nimport { EventEncoder } from \"@ag-ui/encoder\";\nimport { CopilotRuntime } from \"../runtime\";\nimport { extractForwardableHeaders } from \"./header-utils\";\n\ninterface RunAgentParameters {\n request: Request;\n runtime: CopilotRuntime;\n agentId: string;\n}\n\nexport async function handleRunAgent({\n runtime,\n request,\n agentId,\n}: RunAgentParameters) {\n try {\n const agents = await runtime.agents;\n\n // Check if the requested agent exists\n if (!agents[agentId]) {\n return new Response(\n JSON.stringify({\n error: \"Agent not found\",\n message: `Agent '${agentId}' does not exist`,\n }),\n {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const registeredAgent = agents[agentId] as AbstractAgent;\n const agent = registeredAgent.clone() as AbstractAgent;\n\n if (agent && \"headers\" in agent) {\n const forwardableHeaders = extractForwardableHeaders(request);\n agent.headers = {\n ...(agent.headers as Record<string, string>),\n ...forwardableHeaders,\n };\n }\n\n // Parse and validate input BEFORE creating the stream\n // so we can return a proper error response\n let input: RunAgentInput;\n try {\n const requestBody = await request.json();\n input = RunAgentInputSchema.parse(requestBody);\n } catch (error) {\n console.error(\"Invalid run request body:\", error);\n return new Response(\n JSON.stringify({\n error: \"Invalid request body\",\n details: error instanceof Error ? error.message : String(error),\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const stream = new TransformStream();\n const writer = stream.writable.getWriter();\n const encoder = new EventEncoder();\n let streamClosed = false;\n\n agent.setMessages(input.messages);\n agent.setState(input.state);\n agent.threadId = input.threadId;\n\n // Process the agent run in the background\n (async () => {\n runtime.runner\n .run({\n threadId: input.threadId,\n agent,\n input,\n })\n .subscribe({\n next: async (event) => {\n if (!request.signal.aborted && !streamClosed) {\n try {\n await writer.write(encoder.encode(event));\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n streamClosed = true;\n }\n }\n }\n },\n error: async (error) => {\n console.error(\"Error running agent:\", error);\n if (!streamClosed) {\n try {\n await writer.close();\n streamClosed = true;\n } catch {\n // Stream already closed\n }\n }\n },\n complete: async () => {\n if (!streamClosed) {\n try {\n await writer.close();\n streamClosed = true;\n } catch {\n // Stream already closed\n }\n }\n },\n });\n })().catch((error) => {\n console.error(\"Error running agent:\", error);\n console.error(\n \"Error stack:\",\n error instanceof Error ? error.stack : \"No stack trace\",\n );\n console.error(\"Error details:\", {\n name: error instanceof Error ? error.name : \"Unknown\",\n message: error instanceof Error ? error.message : String(error),\n cause: error instanceof Error ? error.cause : undefined,\n });\n if (!streamClosed) {\n try {\n writer.close();\n streamClosed = true;\n } catch {\n // Stream already closed\n }\n }\n });\n\n // Return the SSE response\n return new Response(stream.readable, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"Error running agent:\", error);\n console.error(\n \"Error stack:\",\n error instanceof Error ? error.stack : \"No stack trace\",\n );\n console.error(\"Error details:\", {\n name: error instanceof Error ? error.name : \"Unknown\",\n message: error instanceof Error ? error.message : String(error),\n cause: error instanceof Error ? error.cause : undefined,\n });\n\n return new Response(\n JSON.stringify({\n error: \"Failed to run agent\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","/**\n * Determines if a header should be forwarded based on the allowlist.\n * Forwards: authorization header and all x-* custom headers.\n */\nexport function shouldForwardHeader(headerName: string): boolean {\n const lower = headerName.toLowerCase();\n return lower === \"authorization\" || lower.startsWith(\"x-\");\n}\n\n/**\n * Extracts headers that should be forwarded from a Request object.\n * Forwards only authorization and x-* headers.\n */\nexport function extractForwardableHeaders(\n request: Request,\n): Record<string, string> {\n const forwardableHeaders: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n if (shouldForwardHeader(key)) {\n forwardableHeaders[key] = value;\n }\n });\n return forwardableHeaders;\n}\n","import { RunAgentInput, RunAgentInputSchema } from \"@ag-ui/client\";\nimport { EventEncoder } from \"@ag-ui/encoder\";\nimport { CopilotRuntime } from \"../runtime\";\nimport { extractForwardableHeaders } from \"./header-utils\";\n\ninterface ConnectAgentParameters {\n request: Request;\n runtime: CopilotRuntime;\n agentId: string;\n}\n\nexport async function handleConnectAgent({\n runtime,\n request,\n agentId,\n}: ConnectAgentParameters) {\n try {\n const agents = await runtime.agents;\n\n // Check if the requested agent exists\n if (!agents[agentId]) {\n return new Response(\n JSON.stringify({\n error: \"Agent not found\",\n message: `Agent '${agentId}' does not exist`,\n }),\n {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n // Parse and validate input BEFORE creating the stream\n // so we can return a proper error response\n let input: RunAgentInput;\n try {\n const requestBody = await request.json();\n input = RunAgentInputSchema.parse(requestBody);\n } catch (error) {\n console.error(\"Invalid connect request body:\", error);\n return new Response(\n JSON.stringify({\n error: \"Invalid request body\",\n details: error instanceof Error ? error.message : String(error),\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const stream = new TransformStream();\n const writer = stream.writable.getWriter();\n const encoder = new EventEncoder();\n let streamClosed = false;\n\n // Process the agent connect in the background\n (async () => {\n const forwardableHeaders = extractForwardableHeaders(request);\n\n runtime.runner\n .connect({\n threadId: input.threadId,\n headers: forwardableHeaders,\n })\n .subscribe({\n next: async (event) => {\n if (!request.signal.aborted && !streamClosed) {\n try {\n await writer.write(encoder.encode(event));\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n streamClosed = true;\n }\n }\n }\n },\n error: async (error) => {\n console.error(\"Error running agent:\", error);\n if (!streamClosed) {\n try {\n await writer.close();\n streamClosed = true;\n } catch {\n // Stream already closed\n }\n }\n },\n complete: async () => {\n if (!streamClosed) {\n try {\n await writer.close();\n streamClosed = true;\n } catch {\n // Stream already closed\n }\n }\n },\n });\n })().catch((error) => {\n console.error(\"Error running agent:\", error);\n console.error(\n \"Error stack:\",\n error instanceof Error ? error.stack : \"No stack trace\",\n );\n console.error(\"Error details:\", {\n name: error instanceof Error ? error.name : \"Unknown\",\n message: error instanceof Error ? error.message : String(error),\n cause: error instanceof Error ? error.cause : undefined,\n });\n if (!streamClosed) {\n try {\n writer.close();\n streamClosed = true;\n } catch {\n // Stream already closed\n }\n }\n });\n\n // Return the SSE response\n return new Response(stream.readable, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"Error running agent:\", error);\n console.error(\n \"Error stack:\",\n error instanceof Error ? error.stack : \"No stack trace\",\n );\n console.error(\"Error details:\", {\n name: error instanceof Error ? error.name : \"Unknown\",\n message: error instanceof Error ? error.message : String(error),\n cause: error instanceof Error ? error.cause : undefined,\n });\n\n return new Response(\n JSON.stringify({\n error: \"Failed to run agent\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","import { CopilotRuntime } from \"../runtime\";\nimport { EventType } from \"@ag-ui/client\";\n\ninterface StopAgentParameters {\n request: Request;\n runtime: CopilotRuntime;\n agentId: string;\n threadId: string;\n}\n\nexport async function handleStopAgent({\n runtime,\n request,\n agentId,\n threadId,\n}: StopAgentParameters) {\n try {\n const agents = await runtime.agents;\n\n if (!agents[agentId]) {\n return new Response(\n JSON.stringify({\n error: \"Agent not found\",\n message: `Agent '${agentId}' does not exist`,\n }),\n {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const stopped = await runtime.runner.stop({ threadId });\n\n if (!stopped) {\n return new Response(\n JSON.stringify({\n stopped: false,\n message: `No active run for thread '${threadId}'.`,\n }),\n {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n return new Response(\n JSON.stringify({\n stopped: true,\n interrupt: {\n type: EventType.RUN_ERROR,\n message: \"Run stopped by user\",\n code: \"STOPPED\",\n },\n }),\n {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n } catch (error) {\n console.error(\"Error stopping agent run:\", error);\n\n return new Response(\n JSON.stringify({\n error: \"Failed to stop agent\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","import { CopilotRuntime } from \"../runtime\";\nimport { AgentDescription, RuntimeInfo } from \"@copilotkitnext/shared\";\nimport { VERSION } from \"../runtime\";\n\ninterface HandleGetRuntimeInfoParameters {\n runtime: CopilotRuntime;\n request: Request;\n}\n\nexport async function handleGetRuntimeInfo({\n runtime,\n}: HandleGetRuntimeInfoParameters) {\n try {\n const agents = await runtime.agents;\n\n const agentsDict = Object.entries(agents).reduce(\n (acc, [name, agent]) => {\n acc[name] = {\n name,\n description: agent.description,\n className: agent.constructor.name,\n };\n return acc;\n },\n {} as Record<string, AgentDescription>,\n );\n\n const runtimeInfo: RuntimeInfo = {\n version: VERSION,\n agents: agentsDict,\n audioFileTranscriptionEnabled: !!runtime.transcriptionService,\n };\n\n return new Response(JSON.stringify(runtimeInfo), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n } catch (error) {\n return new Response(\n JSON.stringify({\n error: \"Failed to retrieve runtime information\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","import { CopilotRuntime } from \"../runtime\";\nimport {\n TranscriptionErrorCode,\n TranscriptionErrors,\n type TranscriptionErrorResponse,\n} from \"@copilotkitnext/shared\";\n\n/**\n * HTTP status codes for transcription error codes\n */\nconst ERROR_STATUS_CODES: Record<TranscriptionErrorCode, number> = {\n [TranscriptionErrorCode.SERVICE_NOT_CONFIGURED]: 503,\n [TranscriptionErrorCode.INVALID_AUDIO_FORMAT]: 400,\n [TranscriptionErrorCode.AUDIO_TOO_LONG]: 400,\n [TranscriptionErrorCode.AUDIO_TOO_SHORT]: 400,\n [TranscriptionErrorCode.RATE_LIMITED]: 429,\n [TranscriptionErrorCode.AUTH_FAILED]: 401,\n [TranscriptionErrorCode.PROVIDER_ERROR]: 500,\n [TranscriptionErrorCode.NETWORK_ERROR]: 502,\n [TranscriptionErrorCode.INVALID_REQUEST]: 400,\n};\n\ninterface HandleTranscribeParameters {\n runtime: CopilotRuntime;\n request: Request;\n}\n\ninterface Base64AudioInput {\n audio: string; // base64-encoded audio data\n mimeType: string;\n filename?: string;\n}\n\nconst VALID_AUDIO_TYPES = [\n \"audio/mpeg\",\n \"audio/mp3\",\n \"audio/mp4\",\n \"audio/wav\",\n \"audio/webm\",\n \"audio/ogg\",\n \"audio/flac\",\n \"audio/aac\",\n];\n\nfunction isValidAudioType(type: string): boolean {\n // Extract base MIME type (before semicolon) to handle types like \"audio/webm; codecs=opus\"\n const baseType = type.split(\";\")[0]?.trim() ?? \"\";\n return (\n VALID_AUDIO_TYPES.includes(baseType) ||\n baseType === \"\" ||\n baseType === \"application/octet-stream\"\n );\n}\n\nfunction createErrorResponse(\n errorResponse: TranscriptionErrorResponse,\n): Response {\n const status = ERROR_STATUS_CODES[errorResponse.error] ?? 500;\n return new Response(JSON.stringify(errorResponse), {\n status,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nfunction base64ToFile(\n base64: string,\n mimeType: string,\n filename: string,\n): File {\n // Remove data URL prefix if present (e.g., \"data:audio/webm;base64,\")\n const base64Data = base64.includes(\",\")\n ? (base64.split(\",\")[1] ?? base64)\n : base64;\n\n // Decode base64 to binary\n const binaryString = atob(base64Data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n // Create File object\n return new File([bytes], filename, { type: mimeType });\n}\n\nasync function extractAudioFromFormData(\n request: Request,\n): Promise<{ file: File } | { error: Response }> {\n const formData = await request.formData();\n const audioFile = formData.get(\"audio\") as File | null;\n\n if (!audioFile || !(audioFile instanceof File)) {\n const err = TranscriptionErrors.invalidRequest(\n \"No audio file found in form data. Please include an 'audio' field.\",\n );\n return { error: createErrorResponse(err) };\n }\n\n if (!isValidAudioType(audioFile.type)) {\n const err = TranscriptionErrors.invalidAudioFormat(\n audioFile.type,\n VALID_AUDIO_TYPES,\n );\n return { error: createErrorResponse(err) };\n }\n\n return { file: audioFile };\n}\n\nasync function extractAudioFromJson(\n request: Request,\n): Promise<{ file: File } | { error: Response }> {\n let body: Base64AudioInput;\n\n try {\n body = await request.json();\n } catch {\n const err = TranscriptionErrors.invalidRequest(\n \"Request body must be valid JSON\",\n );\n return { error: createErrorResponse(err) };\n }\n\n if (!body.audio || typeof body.audio !== \"string\") {\n const err = TranscriptionErrors.invalidRequest(\n \"Request must include 'audio' field with base64-encoded audio data\",\n );\n return { error: createErrorResponse(err) };\n }\n\n if (!body.mimeType || typeof body.mimeType !== \"string\") {\n const err = TranscriptionErrors.invalidRequest(\n \"Request must include 'mimeType' field (e.g., 'audio/webm')\",\n );\n return { error: createErrorResponse(err) };\n }\n\n if (!isValidAudioType(body.mimeType)) {\n const err = TranscriptionErrors.invalidAudioFormat(\n body.mimeType,\n VALID_AUDIO_TYPES,\n );\n return { error: createErrorResponse(err) };\n }\n\n try {\n const filename = body.filename || \"recording.webm\";\n const file = base64ToFile(body.audio, body.mimeType, filename);\n return { file };\n } catch {\n const err = TranscriptionErrors.invalidRequest(\n \"Failed to decode base64 audio data\",\n );\n return { error: createErrorResponse(err) };\n }\n}\n\n/**\n * Categorize provider errors into appropriate transcription error responses.\n */\nfunction categorizeProviderError(error: unknown): TranscriptionErrorResponse {\n const message =\n error instanceof Error ? error.message : \"Unknown error occurred\";\n const errorStr = String(error).toLowerCase();\n\n // Check for rate limiting\n if (\n errorStr.includes(\"rate\") ||\n errorStr.includes(\"429\") ||\n errorStr.includes(\"too many\")\n ) {\n return TranscriptionErrors.rateLimited();\n }\n\n // Check for auth errors\n if (\n errorStr.includes(\"auth\") ||\n errorStr.includes(\"401\") ||\n errorStr.includes(\"api key\") ||\n errorStr.includes(\"unauthorized\")\n ) {\n return TranscriptionErrors.authFailed();\n }\n\n // Check for audio too long\n if (\n errorStr.includes(\"too long\") ||\n errorStr.includes(\"duration\") ||\n errorStr.includes(\"length\")\n ) {\n return TranscriptionErrors.audioTooLong();\n }\n\n // Default to provider error\n return TranscriptionErrors.providerError(message);\n}\n\nexport async function handleTranscribe({\n runtime,\n request,\n}: HandleTranscribeParameters) {\n try {\n // Check if transcription service is configured\n if (!runtime.transcriptionService) {\n const err = TranscriptionErrors.serviceNotConfigured();\n return createErrorResponse(err);\n }\n\n // Determine input type based on content-type header\n const contentType = request.headers.get(\"content-type\") || \"\";\n\n let extractResult: { file: File } | { error: Response };\n\n if (contentType.includes(\"multipart/form-data\")) {\n // Handle multipart/form-data (REST mode)\n extractResult = await extractAudioFromFormData(request);\n } else if (contentType.includes(\"application/json\")) {\n // Handle JSON with base64 audio (single-endpoint mode)\n extractResult = await extractAudioFromJson(request);\n } else {\n const err = TranscriptionErrors.invalidRequest(\n \"Request must be multipart/form-data or application/json with base64 audio\",\n );\n return createErrorResponse(err);\n }\n\n // Check for extraction errors\n if (\"error\" in extractResult) {\n return extractResult.error;\n }\n\n const audioFile = extractResult.file;\n\n // Transcribe the audio file\n const transcription = await runtime.transcriptionService.transcribeFile({\n audioFile,\n mimeType: audioFile.type,\n size: audioFile.size,\n });\n\n return new Response(\n JSON.stringify({\n text: transcription,\n size: audioFile.size,\n type: audioFile.type,\n }),\n {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n } catch (error) {\n // Categorize the error for better client-side handling\n return createErrorResponse(categorizeProviderError(error));\n }\n}\n","/**\n * Middleware support for CopilotKit Runtime.\n *\n * A middleware hook can be provided as either:\n * 1. A **callback function** executed in-process.\n * 2. A **webhook URL** (http/https). The runtime will `POST` a JSON payload\n * to the URL and, for *before* hooks, accept an optional modified\n * `Request` object in the response body.\n *\n * Two lifecycle hooks are available:\n * • `BEFORE_REQUEST` – runs *before* the request handler.\n * • `AFTER_REQUEST` – runs *after* the handler returns a `Response`.\n */\n\nimport type { CopilotRuntime } from \"./runtime\";\nimport type { MaybePromise } from \"@copilotkitnext/shared\";\nimport { logger } from \"@copilotkitnext/shared\";\n\n/* ------------------------------------------------------------------------------------------------\n * Public types\n * --------------------------------------------------------------------------------------------- */\n\nexport interface BeforeRequestMiddlewareParameters {\n runtime: CopilotRuntime;\n request: Request;\n path: string;\n}\nexport interface AfterRequestMiddlewareParameters {\n runtime: CopilotRuntime;\n response: Response;\n path: string;\n}\n\nexport type BeforeRequestMiddlewareFn = (\n params: BeforeRequestMiddlewareParameters,\n) => MaybePromise<Request | void>;\nexport type AfterRequestMiddlewareFn = (\n params: AfterRequestMiddlewareParameters,\n) => MaybePromise<void>;\n\n/**\n * A middleware value can be either a callback function or a webhook URL.\n */\nexport type BeforeRequestMiddleware = BeforeRequestMiddlewareFn;\nexport type AfterRequestMiddleware = AfterRequestMiddlewareFn;\n\n/** Lifecycle events emitted to webhook middleware. */\nexport enum CopilotKitMiddlewareEvent {\n BeforeRequest = \"BEFORE_REQUEST\",\n AfterRequest = \"AFTER_REQUEST\",\n}\n\n/** Stages used by the Middleware Webhook Protocol */\n/** Stages used by the CopilotKit webhook protocol */\nexport enum WebhookStage {\n BeforeRequest = \"before_request\",\n AfterRequest = \"after_request\",\n}\n\n/* ------------------------------------------------------------------------------------------------\n * Internal helpers – (de)serialisation\n * --------------------------------------------------------------------------------------------- */\n\nexport async function callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n}: BeforeRequestMiddlewareParameters): Promise<Request | void> {\n const mw = runtime.beforeRequestMiddleware;\n if (!mw) return;\n\n // Function-based middleware (in-process)\n if (typeof mw === \"function\") {\n return (mw as BeforeRequestMiddlewareFn)({ runtime, request, path });\n }\n\n logger.warn({ mw }, \"Unsupported beforeRequestMiddleware value – skipped\");\n return;\n}\n\nexport async function callAfterRequestMiddleware({\n runtime,\n response,\n path,\n}: AfterRequestMiddlewareParameters): Promise<void> {\n const mw = runtime.afterRequestMiddleware;\n if (!mw) return;\n\n if (typeof mw === \"function\") {\n return (mw as AfterRequestMiddlewareFn)({ runtime, response, path });\n }\n\n logger.warn({ mw }, \"Unsupported afterRequestMiddleware value – skipped\");\n}\n","const METHOD_NAMES = [\n \"agent/run\",\n \"agent/connect\",\n \"agent/stop\",\n \"info\",\n \"transcribe\",\n] as const;\n\nexport type EndpointMethod = (typeof METHOD_NAMES)[number];\n\ninterface JsonEnvelope {\n method?: string;\n params?: Record<string, unknown>;\n body?: unknown;\n}\n\nexport interface MethodCall {\n method: EndpointMethod;\n params?: Record<string, unknown>;\n body?: unknown;\n}\n\nexport async function parseMethodCall(request: Request): Promise<MethodCall> {\n const contentType = request.headers.get(\"content-type\") || \"\";\n\n if (!contentType.includes(\"application/json\")) {\n throw createResponseError(\n \"Single-route endpoint expects JSON payloads\",\n 415,\n );\n }\n\n let jsonEnvelope: JsonEnvelope;\n try {\n jsonEnvelope = (await request.clone().json()) as JsonEnvelope;\n } catch (error) {\n throw createResponseError(\"Invalid JSON payload\", 400);\n }\n\n const method = validateMethod(jsonEnvelope.method);\n\n return {\n method,\n params: jsonEnvelope.params,\n body: jsonEnvelope.body,\n };\n}\n\nexport function expectString(\n params: Record<string, unknown> | undefined,\n key: string,\n): string {\n const value = params?.[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n\n throw createResponseError(`Missing or invalid parameter '${key}'`, 400);\n}\n\nexport function createJsonRequest(base: Request, body: unknown): Request {\n if (body === undefined || body === null) {\n throw createResponseError(\"Missing request body for JSON handler\", 400);\n }\n\n const headers = new Headers(base.headers);\n headers.set(\"content-type\", \"application/json\");\n headers.delete(\"content-length\");\n\n const serializedBody = serializeJsonBody(body);\n\n return new Request(base.url, {\n method: \"POST\",\n headers,\n body: serializedBody,\n signal: base.signal,\n });\n}\n\nexport function createResponseError(message: string, status: number): Response {\n return new Response(\n JSON.stringify({\n error: \"invalid_request\",\n message,\n }),\n {\n status,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n },\n );\n}\n\nfunction validateMethod(method: string | undefined): EndpointMethod {\n if (!method) {\n throw createResponseError(\"Missing method field\", 400);\n }\n\n if ((METHOD_NAMES as readonly string[]).includes(method)) {\n return method as EndpointMethod;\n }\n\n throw createResponseError(`Unsupported method '${method}'`, 400);\n}\n\nfunction serializeJsonBody(body: unknown): BodyInit {\n if (typeof body === \"string\") {\n return body;\n }\n\n if (\n body instanceof Blob ||\n body instanceof ArrayBuffer ||\n body instanceof Uint8Array\n ) {\n return body;\n }\n\n if (body instanceof FormData || body instanceof URLSearchParams) {\n return body;\n }\n\n return JSON.stringify(body);\n}\n"],"mappings":"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","names":["RunAgentInputSchema","EventEncoder","RunAgentInputSchema","EventEncoder","EventType"]}
|
package/dist/express.d.mts
CHANGED
|
@@ -8,7 +8,7 @@ interface CopilotExpressEndpointParams {
|
|
|
8
8
|
runtime: CopilotRuntime;
|
|
9
9
|
basePath: string;
|
|
10
10
|
}
|
|
11
|
-
declare function createCopilotEndpointExpress({ runtime, basePath }: CopilotExpressEndpointParams): Router;
|
|
11
|
+
declare function createCopilotEndpointExpress({ runtime, basePath, }: CopilotExpressEndpointParams): Router;
|
|
12
12
|
|
|
13
13
|
interface CopilotSingleRouteExpressParams {
|
|
14
14
|
runtime: CopilotRuntime;
|
package/dist/express.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ interface CopilotExpressEndpointParams {
|
|
|
8
8
|
runtime: CopilotRuntime;
|
|
9
9
|
basePath: string;
|
|
10
10
|
}
|
|
11
|
-
declare function createCopilotEndpointExpress({ runtime, basePath }: CopilotExpressEndpointParams): Router;
|
|
11
|
+
declare function createCopilotEndpointExpress({ runtime, basePath, }: CopilotExpressEndpointParams): Router;
|
|
12
12
|
|
|
13
13
|
interface CopilotSingleRouteExpressParams {
|
|
14
14
|
runtime: CopilotRuntime;
|
package/dist/express.js
CHANGED
|
@@ -397,7 +397,7 @@ async function handleStopAgent({
|
|
|
397
397
|
// package.json
|
|
398
398
|
var package_default = {
|
|
399
399
|
name: "@copilotkitnext/runtime",
|
|
400
|
-
version: "1.51.4
|
|
400
|
+
version: "1.51.4",
|
|
401
401
|
description: "Server-side runtime package for CopilotKit2",
|
|
402
402
|
main: "dist/index.js",
|
|
403
403
|
types: "dist/index.d.ts",
|
|
@@ -421,7 +421,6 @@ var package_default = {
|
|
|
421
421
|
dev: "tsup --watch",
|
|
422
422
|
lint: "eslint .",
|
|
423
423
|
"check-types": "tsc --noEmit",
|
|
424
|
-
clean: "rm -rf dist",
|
|
425
424
|
test: "vitest run",
|
|
426
425
|
"test:watch": "vitest",
|
|
427
426
|
"test:coverage": "vitest run --coverage"
|
|
@@ -602,7 +601,10 @@ async function extractAudioFromFormData(request) {
|
|
|
602
601
|
return { error: createErrorResponse(err) };
|
|
603
602
|
}
|
|
604
603
|
if (!isValidAudioType(audioFile.type)) {
|
|
605
|
-
const err = import_shared2.TranscriptionErrors.invalidAudioFormat(
|
|
604
|
+
const err = import_shared2.TranscriptionErrors.invalidAudioFormat(
|
|
605
|
+
audioFile.type,
|
|
606
|
+
VALID_AUDIO_TYPES
|
|
607
|
+
);
|
|
606
608
|
return { error: createErrorResponse(err) };
|
|
607
609
|
}
|
|
608
610
|
return { file: audioFile };
|
|
@@ -612,7 +614,9 @@ async function extractAudioFromJson(request) {
|
|
|
612
614
|
try {
|
|
613
615
|
body = await request.json();
|
|
614
616
|
} catch {
|
|
615
|
-
const err = import_shared2.TranscriptionErrors.invalidRequest(
|
|
617
|
+
const err = import_shared2.TranscriptionErrors.invalidRequest(
|
|
618
|
+
"Request body must be valid JSON"
|
|
619
|
+
);
|
|
616
620
|
return { error: createErrorResponse(err) };
|
|
617
621
|
}
|
|
618
622
|
if (!body.audio || typeof body.audio !== "string") {
|
|
@@ -628,7 +632,10 @@ async function extractAudioFromJson(request) {
|
|
|
628
632
|
return { error: createErrorResponse(err) };
|
|
629
633
|
}
|
|
630
634
|
if (!isValidAudioType(body.mimeType)) {
|
|
631
|
-
const err = import_shared2.TranscriptionErrors.invalidAudioFormat(
|
|
635
|
+
const err = import_shared2.TranscriptionErrors.invalidAudioFormat(
|
|
636
|
+
body.mimeType,
|
|
637
|
+
VALID_AUDIO_TYPES
|
|
638
|
+
);
|
|
632
639
|
return { error: createErrorResponse(err) };
|
|
633
640
|
}
|
|
634
641
|
try {
|
|
@@ -636,7 +643,9 @@ async function extractAudioFromJson(request) {
|
|
|
636
643
|
const file = base64ToFile(body.audio, body.mimeType, filename);
|
|
637
644
|
return { file };
|
|
638
645
|
} catch {
|
|
639
|
-
const err = import_shared2.TranscriptionErrors.invalidRequest(
|
|
646
|
+
const err = import_shared2.TranscriptionErrors.invalidRequest(
|
|
647
|
+
"Failed to decode base64 audio data"
|
|
648
|
+
);
|
|
640
649
|
return { error: createErrorResponse(err) };
|
|
641
650
|
}
|
|
642
651
|
}
|
|
@@ -872,33 +881,53 @@ function synthesizeBody(body) {
|
|
|
872
881
|
}
|
|
873
882
|
|
|
874
883
|
// src/endpoints/express.ts
|
|
875
|
-
function createCopilotEndpointExpress({
|
|
884
|
+
function createCopilotEndpointExpress({
|
|
885
|
+
runtime,
|
|
886
|
+
basePath
|
|
887
|
+
}) {
|
|
876
888
|
const router = import_express.default.Router();
|
|
877
889
|
const normalizedBase = normalizeBasePath(basePath);
|
|
878
|
-
router.use(
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
router.post(
|
|
900
|
-
|
|
901
|
-
|
|
890
|
+
router.use(
|
|
891
|
+
(0, import_cors.default)({
|
|
892
|
+
origin: "*",
|
|
893
|
+
methods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "OPTIONS"],
|
|
894
|
+
allowedHeaders: ["*"]
|
|
895
|
+
})
|
|
896
|
+
);
|
|
897
|
+
router.post(
|
|
898
|
+
joinPath(normalizedBase, "/agent/:agentId/run"),
|
|
899
|
+
createRouteHandler(runtime, async ({ request, req }) => {
|
|
900
|
+
const agentId = req.params.agentId;
|
|
901
|
+
return handleRunAgent({ runtime, request, agentId });
|
|
902
|
+
})
|
|
903
|
+
);
|
|
904
|
+
router.post(
|
|
905
|
+
joinPath(normalizedBase, "/agent/:agentId/connect"),
|
|
906
|
+
createRouteHandler(runtime, async ({ request, req }) => {
|
|
907
|
+
const agentId = req.params.agentId;
|
|
908
|
+
return handleConnectAgent({ runtime, request, agentId });
|
|
909
|
+
})
|
|
910
|
+
);
|
|
911
|
+
router.post(
|
|
912
|
+
joinPath(normalizedBase, "/agent/:agentId/stop/:threadId"),
|
|
913
|
+
createRouteHandler(runtime, async ({ request, req }) => {
|
|
914
|
+
const agentId = req.params.agentId;
|
|
915
|
+
const threadId = req.params.threadId;
|
|
916
|
+
return handleStopAgent({ runtime, request, agentId, threadId });
|
|
917
|
+
})
|
|
918
|
+
);
|
|
919
|
+
router.get(
|
|
920
|
+
joinPath(normalizedBase, "/info"),
|
|
921
|
+
createRouteHandler(runtime, async ({ request }) => {
|
|
922
|
+
return handleGetRuntimeInfo({ runtime, request });
|
|
923
|
+
})
|
|
924
|
+
);
|
|
925
|
+
router.post(
|
|
926
|
+
joinPath(normalizedBase, "/transcribe"),
|
|
927
|
+
createRouteHandler(runtime, async ({ request }) => {
|
|
928
|
+
return handleTranscribe({ runtime, request });
|
|
929
|
+
})
|
|
930
|
+
);
|
|
902
931
|
router.use(joinPath(normalizedBase, "*"), (req, res) => {
|
|
903
932
|
res.status(404).json({ error: "Not found" });
|
|
904
933
|
});
|
|
@@ -909,12 +938,19 @@ function createRouteHandler(runtime, factory) {
|
|
|
909
938
|
const path = req.originalUrl ?? req.path;
|
|
910
939
|
let request = createFetchRequestFromExpress(req);
|
|
911
940
|
try {
|
|
912
|
-
const maybeModifiedRequest = await callBeforeRequestMiddleware({
|
|
941
|
+
const maybeModifiedRequest = await callBeforeRequestMiddleware({
|
|
942
|
+
runtime,
|
|
943
|
+
request,
|
|
944
|
+
path
|
|
945
|
+
});
|
|
913
946
|
if (maybeModifiedRequest) {
|
|
914
947
|
request = maybeModifiedRequest;
|
|
915
948
|
}
|
|
916
949
|
} catch (error) {
|
|
917
|
-
import_shared5.logger.error(
|
|
950
|
+
import_shared5.logger.error(
|
|
951
|
+
{ err: error, url: request.url, path },
|
|
952
|
+
"Error running before request middleware"
|
|
953
|
+
);
|
|
918
954
|
if (error instanceof Response) {
|
|
919
955
|
try {
|
|
920
956
|
await sendFetchResponse(res, error);
|
|
@@ -930,7 +966,10 @@ function createRouteHandler(runtime, factory) {
|
|
|
930
966
|
const response = await factory({ request, req });
|
|
931
967
|
await sendFetchResponse(res, response);
|
|
932
968
|
callAfterRequestMiddleware({ runtime, response, path }).catch((error) => {
|
|
933
|
-
import_shared5.logger.error(
|
|
969
|
+
import_shared5.logger.error(
|
|
970
|
+
{ err: error, url: req.originalUrl ?? req.url, path },
|
|
971
|
+
"Error running after request middleware"
|
|
972
|
+
);
|
|
934
973
|
});
|
|
935
974
|
} catch (error) {
|
|
936
975
|
if (error instanceof Response) {
|
|
@@ -940,12 +979,20 @@ function createRouteHandler(runtime, factory) {
|
|
|
940
979
|
next(streamError);
|
|
941
980
|
return;
|
|
942
981
|
}
|
|
943
|
-
callAfterRequestMiddleware({ runtime, response: error, path }).catch(
|
|
944
|
-
|
|
945
|
-
|
|
982
|
+
callAfterRequestMiddleware({ runtime, response: error, path }).catch(
|
|
983
|
+
(mwError) => {
|
|
984
|
+
import_shared5.logger.error(
|
|
985
|
+
{ err: mwError, url: req.originalUrl ?? req.url, path },
|
|
986
|
+
"Error running after request middleware"
|
|
987
|
+
);
|
|
988
|
+
}
|
|
989
|
+
);
|
|
946
990
|
return;
|
|
947
991
|
}
|
|
948
|
-
import_shared5.logger.error(
|
|
992
|
+
import_shared5.logger.error(
|
|
993
|
+
{ err: error, url: request.url, path },
|
|
994
|
+
"Error running request handler"
|
|
995
|
+
);
|
|
949
996
|
next(error);
|
|
950
997
|
}
|
|
951
998
|
};
|
|
@@ -991,7 +1038,10 @@ var METHOD_NAMES = [
|
|
|
991
1038
|
async function parseMethodCall(request) {
|
|
992
1039
|
const contentType = request.headers.get("content-type") || "";
|
|
993
1040
|
if (!contentType.includes("application/json")) {
|
|
994
|
-
throw createResponseError(
|
|
1041
|
+
throw createResponseError(
|
|
1042
|
+
"Single-route endpoint expects JSON payloads",
|
|
1043
|
+
415
|
|
1044
|
+
);
|
|
995
1045
|
}
|
|
996
1046
|
let jsonEnvelope;
|
|
997
1047
|
try {
|
|
@@ -1071,11 +1121,13 @@ function createCopilotEndpointSingleRouteExpress({
|
|
|
1071
1121
|
}) {
|
|
1072
1122
|
const router = import_express2.default.Router();
|
|
1073
1123
|
const routePath = normalizeSingleRoutePath(basePath);
|
|
1074
|
-
router.use(
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1124
|
+
router.use(
|
|
1125
|
+
(0, import_cors2.default)({
|
|
1126
|
+
origin: "*",
|
|
1127
|
+
methods: ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "OPTIONS"],
|
|
1128
|
+
allowedHeaders: ["*"]
|
|
1129
|
+
})
|
|
1130
|
+
);
|
|
1079
1131
|
router.post(routePath, createSingleRouteHandler(runtime));
|
|
1080
1132
|
router.use((req, res) => {
|
|
1081
1133
|
res.status(404).json({ error: "Not found" });
|
|
@@ -1087,12 +1139,19 @@ function createSingleRouteHandler(runtime) {
|
|
|
1087
1139
|
const path = req.originalUrl ?? req.path;
|
|
1088
1140
|
let request = createFetchRequestFromExpress(req);
|
|
1089
1141
|
try {
|
|
1090
|
-
const maybeModifiedRequest = await callBeforeRequestMiddleware({
|
|
1142
|
+
const maybeModifiedRequest = await callBeforeRequestMiddleware({
|
|
1143
|
+
runtime,
|
|
1144
|
+
request,
|
|
1145
|
+
path
|
|
1146
|
+
});
|
|
1091
1147
|
if (maybeModifiedRequest) {
|
|
1092
1148
|
request = maybeModifiedRequest;
|
|
1093
1149
|
}
|
|
1094
1150
|
} catch (error) {
|
|
1095
|
-
import_shared6.logger.error(
|
|
1151
|
+
import_shared6.logger.error(
|
|
1152
|
+
{ err: error, url: request.url, path },
|
|
1153
|
+
"Error running before request middleware"
|
|
1154
|
+
);
|
|
1096
1155
|
if (error instanceof Response) {
|
|
1097
1156
|
try {
|
|
1098
1157
|
await sendFetchResponse(res, error);
|
|
@@ -1117,7 +1176,10 @@ function createSingleRouteHandler(runtime) {
|
|
|
1117
1176
|
}
|
|
1118
1177
|
return;
|
|
1119
1178
|
}
|
|
1120
|
-
import_shared6.logger.warn(
|
|
1179
|
+
import_shared6.logger.warn(
|
|
1180
|
+
{ err: error, url: request.url },
|
|
1181
|
+
"Invalid single-route payload"
|
|
1182
|
+
);
|
|
1121
1183
|
res.status(400).json({
|
|
1122
1184
|
error: "invalid_request",
|
|
1123
1185
|
message: error instanceof Error ? error.message : "Invalid request payload"
|
|
@@ -1130,19 +1192,32 @@ function createSingleRouteHandler(runtime) {
|
|
|
1130
1192
|
case "agent/run": {
|
|
1131
1193
|
const agentId = expectString(methodCall.params, "agentId");
|
|
1132
1194
|
const handlerRequest = createJsonRequest(request, methodCall.body);
|
|
1133
|
-
response = await handleRunAgent({
|
|
1195
|
+
response = await handleRunAgent({
|
|
1196
|
+
runtime,
|
|
1197
|
+
request: handlerRequest,
|
|
1198
|
+
agentId
|
|
1199
|
+
});
|
|
1134
1200
|
break;
|
|
1135
1201
|
}
|
|
1136
1202
|
case "agent/connect": {
|
|
1137
1203
|
const agentId = expectString(methodCall.params, "agentId");
|
|
1138
1204
|
const handlerRequest = createJsonRequest(request, methodCall.body);
|
|
1139
|
-
response = await handleConnectAgent({
|
|
1205
|
+
response = await handleConnectAgent({
|
|
1206
|
+
runtime,
|
|
1207
|
+
request: handlerRequest,
|
|
1208
|
+
agentId
|
|
1209
|
+
});
|
|
1140
1210
|
break;
|
|
1141
1211
|
}
|
|
1142
1212
|
case "agent/stop": {
|
|
1143
1213
|
const agentId = expectString(methodCall.params, "agentId");
|
|
1144
1214
|
const threadId = expectString(methodCall.params, "threadId");
|
|
1145
|
-
response = await handleStopAgent({
|
|
1215
|
+
response = await handleStopAgent({
|
|
1216
|
+
runtime,
|
|
1217
|
+
request,
|
|
1218
|
+
agentId,
|
|
1219
|
+
threadId
|
|
1220
|
+
});
|
|
1146
1221
|
break;
|
|
1147
1222
|
}
|
|
1148
1223
|
case "info": {
|
|
@@ -1151,7 +1226,10 @@ function createSingleRouteHandler(runtime) {
|
|
|
1151
1226
|
}
|
|
1152
1227
|
case "transcribe": {
|
|
1153
1228
|
const handlerRequest = createJsonRequest(request, methodCall.body);
|
|
1154
|
-
response = await handleTranscribe({
|
|
1229
|
+
response = await handleTranscribe({
|
|
1230
|
+
runtime,
|
|
1231
|
+
request: handlerRequest
|
|
1232
|
+
});
|
|
1155
1233
|
break;
|
|
1156
1234
|
}
|
|
1157
1235
|
default: {
|
|
@@ -1161,7 +1239,10 @@ function createSingleRouteHandler(runtime) {
|
|
|
1161
1239
|
}
|
|
1162
1240
|
await sendFetchResponse(res, response);
|
|
1163
1241
|
callAfterRequestMiddleware({ runtime, response, path }).catch((error) => {
|
|
1164
|
-
import_shared6.logger.error(
|
|
1242
|
+
import_shared6.logger.error(
|
|
1243
|
+
{ err: error, url: req.originalUrl ?? req.url, path },
|
|
1244
|
+
"Error running after request middleware"
|
|
1245
|
+
);
|
|
1165
1246
|
});
|
|
1166
1247
|
} catch (error) {
|
|
1167
1248
|
if (error instanceof Response) {
|
|
@@ -1171,19 +1252,29 @@ function createSingleRouteHandler(runtime) {
|
|
|
1171
1252
|
next(streamError);
|
|
1172
1253
|
return;
|
|
1173
1254
|
}
|
|
1174
|
-
callAfterRequestMiddleware({ runtime, response: error, path }).catch(
|
|
1175
|
-
|
|
1176
|
-
|
|
1255
|
+
callAfterRequestMiddleware({ runtime, response: error, path }).catch(
|
|
1256
|
+
(mwError) => {
|
|
1257
|
+
import_shared6.logger.error(
|
|
1258
|
+
{ err: mwError, url: req.originalUrl ?? req.url, path },
|
|
1259
|
+
"Error running after request middleware"
|
|
1260
|
+
);
|
|
1261
|
+
}
|
|
1262
|
+
);
|
|
1177
1263
|
return;
|
|
1178
1264
|
}
|
|
1179
|
-
import_shared6.logger.error(
|
|
1265
|
+
import_shared6.logger.error(
|
|
1266
|
+
{ err: error, url: request.url, path },
|
|
1267
|
+
"Error running single-route handler"
|
|
1268
|
+
);
|
|
1180
1269
|
next(error);
|
|
1181
1270
|
}
|
|
1182
1271
|
};
|
|
1183
1272
|
}
|
|
1184
1273
|
function normalizeSingleRoutePath(path) {
|
|
1185
1274
|
if (!path) {
|
|
1186
|
-
throw new Error(
|
|
1275
|
+
throw new Error(
|
|
1276
|
+
"basePath must be provided for Express single-route endpoint"
|
|
1277
|
+
);
|
|
1187
1278
|
}
|
|
1188
1279
|
if (!path.startsWith("/")) {
|
|
1189
1280
|
return `/${path}`;
|