@copilotkitnext/runtime 0.0.18 → 0.0.19-threads-and-attachements.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/runner/agent-runner.ts","../src/runner/in-memory.ts","../src/runtime.ts","../src/endpoint.ts","../src/handlers/handle-run.ts","../src/handlers/get-runtime-info.ts","../src/handlers/handle-transcribe.ts","../src/middleware.ts","../src/handlers/handle-connect.ts","../src/handlers/handle-stop.ts","../src/runner/index.ts"],"sourcesContent":["{\n \"name\": \"@copilotkitnext/runtime\",\n \"version\": \"0.0.18\",\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 },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepublishOnly\": \"pnpm run build\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"check-types\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\",\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/node\": \"^22.15.3\",\n \"eslint\": \"^9.30.0\",\n \"openai\": \"^5.9.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"5.8.2\",\n \"vitest\": \"^3.0.5\"\n },\n \"dependencies\": {\n \"@ag-ui/client\": \"0.0.40-alpha.6\",\n \"@ag-ui/core\": \"0.0.40-alpha.6\",\n \"@ag-ui/encoder\": \"0.0.40-alpha.6\",\n \"@copilotkitnext/shared\": \"workspace:*\",\n \"hono\": \"^4.6.13\",\n \"rxjs\": \"7.8.1\"\n },\n \"peerDependencies\": {\n \"openai\": \"^5.9.0\"\n },\n \"peerDependenciesMeta\": {},\n \"engines\": {\n \"node\": \">=18\"\n }\n}\n","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}\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\nconst GLOBAL_STORE = new Map<string, InMemoryEventStore>();\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\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 {\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 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\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","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 { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { CopilotRuntime } from \"./runtime\";\nimport { handleRunAgent } from \"./handlers/handle-run\";\nimport { handleGetRuntimeInfo } from \"./handlers/get-runtime-info\";\nimport { handleTranscribe } from \"./handlers/handle-transcribe\";\nimport { logger } from \"@copilotkitnext/shared\";\nimport { callBeforeRequestMiddleware, callAfterRequestMiddleware } from \"./middleware\";\nimport { handleConnectAgent } from \"./handlers/handle-connect\";\nimport { handleStopAgent } from \"./handlers/handle-stop\";\n\ninterface CopilotEndpointParams {\n runtime: CopilotRuntime;\n basePath: string;\n}\n\n// Define the context variables type\ntype CopilotEndpointContext = {\n Variables: {\n modifiedRequest?: Request;\n };\n};\n\nexport function createCopilotEndpoint({ runtime, basePath }: CopilotEndpointParams) {\n const app = new Hono<CopilotEndpointContext>();\n\n return app\n .basePath(basePath)\n .use(\n \"*\",\n cors({\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowHeaders: [\"*\"],\n }),\n )\n .use(\"*\", async (c, next) => {\n const request = c.req.raw;\n const path = c.req.path;\n\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n c.set(\"modifiedRequest\", maybeModifiedRequest);\n }\n } catch (error) {\n logger.error({ err: error, url: request.url, path }, \"Error running before request middleware\");\n if (error instanceof Response) {\n return error;\n }\n throw error;\n }\n\n await next();\n })\n .use(\"*\", async (c, next) => {\n await next();\n\n const response = c.res;\n const path = c.req.path;\n\n // Non-blocking after middleware\n callAfterRequestMiddleware({\n runtime,\n response,\n path,\n }).catch((error) => {\n logger.error({ err: error, url: c.req.url, path }, \"Error running after request middleware\");\n });\n })\n .post(\"/agent/:agentId/run\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleRunAgent({\n runtime,\n request,\n agentId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .post(\"/agent/:agentId/connect\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleConnectAgent({\n runtime,\n request,\n agentId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n\n .post(\"/agent/:agentId/stop/:threadId\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const threadId = c.req.param(\"threadId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleStopAgent({\n runtime,\n request,\n agentId,\n threadId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .get(\"/info\", async (c) => {\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleGetRuntimeInfo({\n runtime,\n request,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .post(\"/transcribe\", async (c) => {\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleTranscribe({\n runtime,\n request,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .notFound((c) => {\n return c.json({ error: \"Not found\" }, 404);\n });\n\n // return app;\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\";\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 shouldForward = (headerName: string) => {\n const lower = headerName.toLowerCase();\n return lower === \"authorization\" || lower.startsWith(\"x-\");\n };\n\n const forwardableHeaders: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n if (shouldForward(key)) {\n forwardableHeaders[key] = value;\n }\n });\n\n agent.headers = { \n ...agent.headers as Record<string, string>, \n ...forwardableHeaders \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 request in the background\n (async () => {\n let input: RunAgentInput;\n try {\n const requestBody = await request.json();\n input = RunAgentInputSchema.parse(requestBody);\n } catch {\n return new Response(\n JSON.stringify({\n error: \"Invalid request body\",\n }),\n { status: 400 }\n );\n }\n\n agent.setMessages(input.messages);\n agent.setState(input.state);\n agent.threadId = input.threadId;\n\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","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\";\n\ninterface HandleTranscribeParameters {\n runtime: CopilotRuntime;\n request: Request;\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 return new Response(\n JSON.stringify({\n error: \"Transcription service not configured\",\n message:\n \"No transcription service has been configured in the runtime\",\n }),\n {\n status: 503,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Check if request has form data\n const contentType = request.headers.get(\"content-type\");\n if (!contentType || !contentType.includes(\"multipart/form-data\")) {\n return new Response(\n JSON.stringify({\n error: \"Invalid content type\",\n message:\n \"Request must contain multipart/form-data with an audio file\",\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Extract form data\n const formData = await request.formData();\n const audioFile = formData.get(\"audio\") as File | null;\n\n if (!audioFile || !(audioFile instanceof File)) {\n return new Response(\n JSON.stringify({\n error: \"Missing audio file\",\n message:\n \"No audio file found in form data. Please include an 'audio' field.\",\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Validate file type (basic check)\n const validAudioTypes = [\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\n // Allow empty types and application/octet-stream (common fallback for unknown types)\n const isValidType =\n validAudioTypes.includes(audioFile.type) ||\n audioFile.type === \"\" ||\n audioFile.type === \"application/octet-stream\";\n\n if (!isValidType) {\n return new Response(\n JSON.stringify({\n error: \"Invalid file type\",\n message: `Unsupported audio file type: ${audioFile.type}. Supported types: ${validAudioTypes.join(\", \")}, or files with unknown/empty types`,\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Transcribe the audio file with options\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 return new Response(\n JSON.stringify({\n error: \"Transcription failed\",\n message:\n error instanceof Error\n ? error.message\n : \"Unknown error occurred during transcription\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\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","import { RunAgentInput, RunAgentInputSchema } from \"@ag-ui/client\";\nimport { EventEncoder } from \"@ag-ui/encoder\";\nimport { CopilotRuntime } from \"../runtime\";\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 const stream = new TransformStream();\n const writer = stream.writable.getWriter();\n const encoder = new EventEncoder();\n let streamClosed = false;\n\n // Process the request in the background\n (async () => {\n let input: RunAgentInput;\n try {\n const requestBody = await request.json();\n input = RunAgentInputSchema.parse(requestBody);\n } catch {\n return new Response(\n JSON.stringify({\n error: \"Invalid request body\",\n }),\n { status: 400 }\n );\n }\n\n runtime.runner\n .connect({\n threadId: input.threadId,\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","export * from \"./agent-runner\";\nexport * from \"./in-memory\";\nexport { finalizeRunEvents } from \"@copilotkitnext/shared\";\n"],"mappings":"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","names":["logger","RunAgentInputSchema","EventEncoder","EventType","logger","finalizeRunEvents"]}
1
+ {"version":3,"sources":["../src/runtime.ts","../package.json","../src/runner/agent-runner.ts","../src/runner/in-memory.ts","../src/endpoint.ts","../src/handlers/handle-run.ts","../src/handlers/get-runtime-info.ts","../src/handlers/handle-transcribe.ts","../src/middleware.ts","../src/handlers/handle-connect.ts","../src/handlers/handle-stop.ts","../src/handlers/handle-threads.ts","../src/runner/index.ts","../src/resource-id-helpers.ts"],"sourcesContent":["import { MaybePromise, NonEmptyRecord, logger } from \"@copilotkitnext/shared\";\nimport { AbstractAgent } from \"@ag-ui/client\";\nimport pkg from \"../package.json\";\nimport type { BeforeRequestMiddleware, AfterRequestMiddleware } from \"./middleware\";\nimport { TranscriptionService } from \"./transcription-service/transcription-service\";\nimport { AgentRunner, ResourceScope } from \"./runner/agent-runner\";\nimport { InMemoryAgentRunner } from \"./runner/in-memory\";\n\nexport const VERSION = pkg.version;\nexport type { ResourceScope } from \"./runner/agent-runner\";\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 * Resolve the resource scope for thread access control.\n * This is where you authenticate the request and determine which resource(s)\n * the user has access to.\n *\n * If not provided, defaults to GLOBAL_SCOPE (all threads globally accessible).\n *\n * Return `null` for admin bypass (no filtering).\n *\n * @param context.request - The incoming HTTP request\n * @param context.clientDeclared - Resource ID(s) the client declares it wants to access (must be validated)\n *\n * @example\n * ```typescript\n * // Basic usage (determine access from authentication)\n * resolveThreadsScope: async ({ request }) => {\n * const user = await authenticate(request);\n * return { resourceId: user.id };\n * }\n *\n * // Validate client-declared resourceId\n * resolveThreadsScope: async ({ request, clientDeclared }) => {\n * const user = await authenticate(request);\n * if (clientDeclared && clientDeclared !== user.id) {\n * throw new Error('Unauthorized');\n * }\n * return { resourceId: user.id };\n * }\n *\n * // Multi-resource: Filter client-declared IDs to only those user has access to\n * resolveThreadsScope: async ({ request, clientDeclared }) => {\n * const user = await authenticate(request);\n * const userResourceIds = await getUserResourceIds(user);\n * const requestedIds = Array.isArray(clientDeclared) ? clientDeclared : [clientDeclared];\n * const allowedIds = requestedIds.filter(id => userResourceIds.includes(id));\n * return { resourceId: allowedIds };\n * }\n * ```\n */\n resolveThreadsScope?: (context: {\n request: Request;\n clientDeclared?: string | string[];\n }) => Promise<ResourceScope | null>;\n /**\n * Suppress warning when using GLOBAL_SCOPE.\n *\n * Set to `true` if you intentionally want all threads to be globally accessible\n * (e.g., single-user apps, demos, prototypes).\n */\n suppressResourceIdWarning?: boolean;\n}\n\n/**\n * Central runtime object passed to all request handlers.\n */\nexport class CopilotRuntime {\n /**\n * Built-in global scope for single-user apps or demos.\n *\n * All threads are globally accessible when using this scope.\n *\n * @example\n * ```typescript\n * new CopilotRuntime({\n * agents: { myAgent },\n * resolveThreadsScope: CopilotRuntime.GLOBAL_SCOPE,\n * suppressResourceIdWarning: true\n * });\n * ```\n */\n static readonly GLOBAL_SCOPE = async (context: {\n request: Request;\n clientDeclared?: string | string[];\n }): Promise<ResourceScope> => ({\n resourceId: \"global\",\n });\n\n /**\n * Parses the client-declared resource ID(s) from the request header.\n *\n * This is a utility method used internally by handlers to extract the\n * `X-CopilotKit-Resource-ID` header sent by the client via `CopilotKitProvider`.\n *\n * **You typically don't need to call this directly** - it's automatically called\n * by the runtime handlers and passed to your `resolveThreadsScope` function as\n * the `clientDeclared` parameter.\n *\n * @param request - The incoming HTTP request\n * @returns The parsed resource ID(s), or undefined if header is missing\n * - Returns a string if single ID\n * - Returns an array if multiple comma-separated IDs\n * - Returns undefined if header not present\n *\n * @example\n * ```typescript\n * // Automatically used internally:\n * const clientDeclared = CopilotRuntime.parseClientDeclaredResourceId(request);\n * const scope = await runtime.resolveThreadsScope({ request, clientDeclared });\n * ```\n */\n public static parseClientDeclaredResourceId(request: Request): string | string[] | undefined {\n const header = request.headers.get(\"X-CopilotKit-Resource-ID\");\n if (!header) {\n return undefined;\n }\n\n // Parse comma-separated, URI-encoded values\n const values = header.split(\",\").map((v) => decodeURIComponent(v.trim()));\n return values.length === 1 ? values[0] : values;\n }\n\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 public resolveThreadsScope: (context: {\n request: Request;\n clientDeclared?: string | string[];\n }) => Promise<ResourceScope | null>;\n private suppressResourceIdWarning: boolean;\n\n constructor({\n agents,\n transcriptionService,\n beforeRequestMiddleware,\n afterRequestMiddleware,\n runner,\n resolveThreadsScope,\n suppressResourceIdWarning = false,\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 this.resolveThreadsScope = resolveThreadsScope ?? CopilotRuntime.GLOBAL_SCOPE;\n this.suppressResourceIdWarning = suppressResourceIdWarning;\n\n // Warn if using GLOBAL_SCOPE without explicit configuration\n if (!resolveThreadsScope && !suppressResourceIdWarning) {\n this.logGlobalScopeWarning();\n }\n }\n\n private logGlobalScopeWarning(): void {\n const isProduction = process.env.NODE_ENV === \"production\";\n\n if (isProduction) {\n logger.error({\n msg: \"CopilotKit Security Warning: GLOBAL_SCOPE in production\",\n details:\n \"No resolveThreadsScope configured. All threads are globally accessible to all users. \" +\n \"Configure authentication for production: https://docs.copilotkit.ai/security/thread-scoping \" +\n \"To suppress this warning (if intentional), set suppressResourceIdWarning: true\",\n });\n } else {\n logger.warn({\n msg: \"CopilotKit: Using GLOBAL_SCOPE\",\n details:\n \"No resolveThreadsScope configured. All threads are globally accessible. \" +\n \"This is fine for development, but add authentication for production: \" +\n \"https://docs.copilotkit.ai/security/thread-scoping\",\n });\n }\n }\n}\n","{\n \"name\": \"@copilotkitnext/runtime\",\n \"version\": \"0.0.19-threads-and-attachements.0\",\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 },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepublishOnly\": \"pnpm run build\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"check-types\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\",\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/node\": \"^22.15.3\",\n \"eslint\": \"^9.30.0\",\n \"openai\": \"^5.9.0\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"5.8.2\",\n \"vitest\": \"^3.0.5\"\n },\n \"dependencies\": {\n \"@ag-ui/client\": \"0.0.40-alpha.7\",\n \"@ag-ui/core\": \"0.0.40-alpha.7\",\n \"@ag-ui/encoder\": \"0.0.40-alpha.7\",\n \"@copilotkitnext/shared\": \"workspace:*\",\n \"hono\": \"^4.6.13\",\n \"rxjs\": \"7.8.1\"\n },\n \"peerDependencies\": {\n \"openai\": \"^5.9.0\"\n },\n \"peerDependenciesMeta\": {},\n \"engines\": {\n \"node\": \">=18\"\n }\n}\n","import { AbstractAgent, BaseEvent, RunAgentInput } from \"@ag-ui/client\";\nimport { Observable } from \"rxjs\";\nimport { ThreadMetadata } from \"@copilotkitnext/shared\";\n\n// Re-export ThreadMetadata for convenience\nexport type { ThreadMetadata };\n\n/**\n * Resource scope for thread access control.\n *\n * @property resourceId - Primary isolation dimension (indexed, fast queries).\n * Can be a single string or array of strings for multi-resource access.\n * @property properties - Optional metadata (flexible, slower JSON queries).\n */\nexport interface ResourceScope {\n resourceId: string | string[];\n properties?: Record<string, any>;\n}\n\nexport interface AgentRunnerRunRequest {\n threadId: string;\n agent: AbstractAgent;\n input: RunAgentInput;\n scope?: ResourceScope | null;\n}\n\nexport interface AgentRunnerConnectRequest {\n threadId: string;\n scope?: ResourceScope | null;\n}\n\nexport interface AgentRunnerIsRunningRequest {\n threadId: string;\n}\n\nexport interface AgentRunnerStopRequest {\n threadId: string;\n}\n\nexport interface AgentRunnerListThreadsRequest {\n scope?: ResourceScope | null;\n limit?: number;\n offset?: number;\n}\n\nexport interface AgentRunnerListThreadsResponse {\n threads: ThreadMetadata[];\n total: number;\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 abstract listThreads(request: AgentRunnerListThreadsRequest): Promise<AgentRunnerListThreadsResponse>;\n abstract getThreadMetadata(threadId: string, scope?: ResourceScope | null): Promise<ThreadMetadata | null>;\n abstract deleteThread(threadId: string, scope?: ResourceScope | null): Promise<void>;\n}\n","import {\n AgentRunner,\n AgentRunnerConnectRequest,\n AgentRunnerIsRunningRequest,\n AgentRunnerRunRequest,\n type AgentRunnerStopRequest,\n type AgentRunnerListThreadsRequest,\n type AgentRunnerListThreadsResponse,\n} from \"./agent-runner\";\nimport { ThreadMetadata } from \"@copilotkitnext/shared\";\nimport { Observable, ReplaySubject } from \"rxjs\";\nimport {\n AbstractAgent,\n BaseEvent,\n EventType,\n MessagesSnapshotEvent,\n RunStartedEvent,\n TextMessageContentEvent,\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(\n public threadId: string,\n public resourceIds: string[],\n public properties?: Record<string, any>,\n ) {}\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\nconst GLOBAL_STORE = new Map<string, InMemoryEventStore>();\n\n/**\n * Check if a store's resourceIds match the given scope.\n * Returns true if scope is undefined (global), null (admin bypass), or if ANY store resourceId matches ANY scope resourceId.\n */\nfunction matchesScope(store: InMemoryEventStore, scope: { resourceId: string | string[] } | null | undefined): boolean {\n if (scope === undefined || scope === null) {\n return true; // Undefined (global) or null (admin) - see all threads\n }\n\n const scopeIds = Array.isArray(scope.resourceId) ? scope.resourceId : [scope.resourceId];\n // Check if ANY scope ID matches ANY of the thread's resource IDs\n return scopeIds.some((scopeId) => store.resourceIds.includes(scopeId));\n}\n\nexport class InMemoryAgentRunner extends AgentRunner {\n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n // Check if thread exists first\n let existingStore = GLOBAL_STORE.get(request.threadId);\n\n // SECURITY: Prevent null scope on NEW thread creation (admin must specify explicit owner)\n // BUT allow null scope for existing threads (admin bypass)\n if (!existingStore && request.scope === null) {\n throw new Error(\n \"Cannot create thread with null scope. Admin users must specify an explicit resourceId for the thread owner.\",\n );\n }\n\n // Handle scope: undefined (not provided) defaults to global, or explicit value(s)\n let resourceIds: string[];\n if (request.scope === undefined) {\n // No scope provided - default to global\n resourceIds = [\"global\"];\n } else if (request.scope === null) {\n // Null scope on existing thread (admin bypass) - use existing resource IDs\n resourceIds = [];\n } else if (Array.isArray(request.scope.resourceId)) {\n // Reject empty arrays - unclear intent\n if (request.scope.resourceId.length === 0) {\n throw new Error(\"Invalid scope: resourceId array cannot be empty\");\n }\n // Store ALL resource IDs for multi-resource threads\n resourceIds = request.scope.resourceId;\n } else {\n resourceIds = [request.scope.resourceId];\n }\n\n // SECURITY: Validate scope before allowing operations on existing threads\n if (existingStore) {\n // Thread exists - validate scope matches (null scope bypasses this check)\n if (request.scope !== null && !matchesScope(existingStore, request.scope)) {\n throw new Error(\"Unauthorized: Cannot run on thread owned by different resource\");\n }\n // For existing threads, use existing resource IDs (don't add new ones)\n resourceIds = existingStore.resourceIds;\n } else {\n // Create new thread store with validated scope - store ALL resource IDs\n existingStore = new InMemoryEventStore(request.threadId, resourceIds, request.scope?.properties);\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((message) => !historicMessageIds.has(message.id))\n : undefined;\n const updatedInput = {\n ...request.input,\n ...(sanitizedMessages !== undefined ? { messages: sanitizedMessages } : {}),\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\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 {\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 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\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 || !matchesScope(store, request.scope)) {\n // No store or scope mismatch - return empty (404)\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 (\"messageId\" in event && typeof event.messageId === \"string\" && emittedMessageIds.has(event.messageId)) {\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 async stop(request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n const store = GLOBAL_STORE.get(request.threadId);\n if (!store) {\n return false;\n }\n\n if (store.isRunning) {\n store.stopRequested = true;\n store.isRunning = false;\n\n const agent = store.agent;\n\n try {\n // Use agent.abortRun() to stop the run\n if (agent) {\n agent.abortRun();\n return true;\n }\n return false;\n } catch (error) {\n console.warn(\"Failed to abort in-memory runner:\", error);\n store.stopRequested = false;\n store.isRunning = true;\n return false;\n }\n }\n\n return false;\n }\n\n async listThreads(request: AgentRunnerListThreadsRequest): Promise<AgentRunnerListThreadsResponse> {\n const limit = request.limit ?? 50;\n const offset = request.offset ?? 0;\n\n // Short-circuit: empty array means no access to any threads\n if (request.scope !== undefined && request.scope !== null) {\n const scopeIds = Array.isArray(request.scope.resourceId) ? request.scope.resourceId : [request.scope.resourceId];\n\n if (scopeIds.length === 0) {\n return { threads: [], total: 0 };\n }\n }\n\n // Get all thread IDs and sort by last activity\n const threadInfos: Array<{\n threadId: string;\n createdAt: number;\n lastActivityAt: number;\n store: InMemoryEventStore;\n }> = [];\n\n for (const [threadId, store] of GLOBAL_STORE.entries()) {\n // Skip suggestion threads\n if (threadId.includes(\"-suggestions-\")) {\n continue;\n }\n\n // Filter by scope\n if (!matchesScope(store, request.scope)) {\n continue;\n }\n\n if (store.historicRuns.length === 0) {\n continue; // Skip threads with no runs\n }\n\n const firstRun = store.historicRuns[0];\n const lastRun = store.historicRuns[store.historicRuns.length - 1];\n\n if (!firstRun || !lastRun) {\n continue; // Skip if no runs\n }\n\n threadInfos.push({\n threadId,\n createdAt: firstRun.createdAt,\n lastActivityAt: lastRun.createdAt,\n store,\n });\n }\n\n // Sort by last activity (most recent first)\n threadInfos.sort((a, b) => b.lastActivityAt - a.lastActivityAt);\n\n const total = threadInfos.length;\n const paginatedInfos = threadInfos.slice(offset, offset + limit);\n\n const threads: ThreadMetadata[] = paginatedInfos.map((info) => {\n // Extract first message from first run\n let firstMessage: string | undefined;\n const firstRun = info.store.historicRuns[0];\n if (firstRun) {\n const textContent = firstRun.events.find((e) => e.type === EventType.TEXT_MESSAGE_CONTENT) as\n | TextMessageContentEvent\n | undefined;\n if (textContent?.delta) {\n firstMessage = textContent.delta.substring(0, 100);\n }\n }\n\n // Count unique messages across all runs\n const messageIds = new Set<string>();\n for (const run of info.store.historicRuns) {\n for (const event of run.events) {\n if (\"messageId\" in event && typeof event.messageId === \"string\") {\n messageIds.add(event.messageId);\n }\n }\n }\n\n return {\n threadId: info.threadId,\n createdAt: info.createdAt,\n lastActivityAt: info.lastActivityAt,\n isRunning: info.store.isRunning,\n messageCount: messageIds.size,\n firstMessage,\n resourceId: info.store.resourceIds[0] || \"unknown\", // Return first for backward compatibility\n properties: info.store.properties,\n };\n });\n\n return { threads, total };\n }\n\n async getThreadMetadata(\n threadId: string,\n scope?: { resourceId: string | string[] } | null,\n ): Promise<ThreadMetadata | null> {\n const store = GLOBAL_STORE.get(threadId);\n if (!store || !matchesScope(store, scope) || store.historicRuns.length === 0) {\n return null;\n }\n\n const firstRun = store.historicRuns[0];\n const lastRun = store.historicRuns[store.historicRuns.length - 1];\n\n if (!firstRun || !lastRun) {\n return null;\n }\n\n // Extract first message\n let firstMessage: string | undefined;\n const textContent = firstRun.events.find((e) => e.type === EventType.TEXT_MESSAGE_CONTENT) as\n | TextMessageContentEvent\n | undefined;\n if (textContent?.delta) {\n firstMessage = textContent.delta.substring(0, 100);\n }\n\n // Count unique messages\n const messageIds = 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 messageIds.add(event.messageId);\n }\n }\n }\n\n return {\n threadId,\n createdAt: firstRun.createdAt,\n lastActivityAt: lastRun.createdAt,\n isRunning: store.isRunning,\n messageCount: messageIds.size,\n firstMessage,\n resourceId: store.resourceIds[0] || \"unknown\", // Return first for backward compatibility\n properties: store.properties,\n };\n }\n\n async deleteThread(threadId: string, scope?: { resourceId: string | string[] } | null): Promise<void> {\n const store = GLOBAL_STORE.get(threadId);\n if (!store || !matchesScope(store, scope)) {\n return;\n }\n\n // Abort the agent if running\n if (store.agent) {\n try {\n store.agent.abortRun();\n } catch (error) {\n console.warn(\"Failed to abort agent during thread deletion:\", error);\n }\n }\n store.subject?.complete();\n GLOBAL_STORE.delete(threadId);\n }\n\n /**\n * Clear all threads from the global store (for testing purposes only)\n * @internal\n */\n clearAllThreads(): void {\n for (const [threadId, store] of GLOBAL_STORE.entries()) {\n // Abort the agent if running\n if (store.agent) {\n try {\n store.agent.abortRun();\n } catch (error) {\n console.warn(\"Failed to abort agent during clearAllThreads:\", error);\n }\n }\n store.subject?.complete();\n GLOBAL_STORE.delete(threadId);\n }\n }\n}\n","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { CopilotRuntime } from \"./runtime\";\nimport { handleRunAgent } from \"./handlers/handle-run\";\nimport { handleGetRuntimeInfo } from \"./handlers/get-runtime-info\";\nimport { handleTranscribe } from \"./handlers/handle-transcribe\";\nimport { logger } from \"@copilotkitnext/shared\";\nimport { callBeforeRequestMiddleware, callAfterRequestMiddleware } from \"./middleware\";\nimport { handleConnectAgent } from \"./handlers/handle-connect\";\nimport { handleStopAgent } from \"./handlers/handle-stop\";\nimport { handleListThreads, handleGetThread, handleDeleteThread } from \"./handlers/handle-threads\";\n\ninterface CopilotEndpointParams {\n runtime: CopilotRuntime;\n basePath: string;\n}\n\n// Define the context variables type\ntype CopilotEndpointContext = {\n Variables: {\n modifiedRequest?: Request;\n };\n};\n\nexport function createCopilotEndpoint({ runtime, basePath }: CopilotEndpointParams) {\n const app = new Hono<CopilotEndpointContext>();\n\n return app\n .basePath(basePath)\n .use(\n \"*\",\n cors({\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowHeaders: [\"*\"],\n }),\n )\n .use(\"*\", async (c, next) => {\n const request = c.req.raw;\n const path = c.req.path;\n\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n c.set(\"modifiedRequest\", maybeModifiedRequest);\n }\n } catch (error) {\n logger.error({ err: error, url: request.url, path }, \"Error running before request middleware\");\n if (error instanceof Response) {\n return error;\n }\n throw error;\n }\n\n await next();\n })\n .use(\"*\", async (c, next) => {\n await next();\n\n const response = c.res;\n const path = c.req.path;\n\n // Non-blocking after middleware\n callAfterRequestMiddleware({\n runtime,\n response,\n path,\n }).catch((error) => {\n logger.error({ err: error, url: c.req.url, path }, \"Error running after request middleware\");\n });\n })\n .post(\"/agent/:agentId/run\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleRunAgent({\n runtime,\n request,\n agentId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .post(\"/agent/:agentId/connect\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleConnectAgent({\n runtime,\n request,\n agentId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n\n .post(\"/agent/:agentId/stop/:threadId\", async (c) => {\n const agentId = c.req.param(\"agentId\");\n const threadId = c.req.param(\"threadId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleStopAgent({\n runtime,\n request,\n agentId,\n threadId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .get(\"/info\", async (c) => {\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleGetRuntimeInfo({\n runtime,\n request,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .post(\"/transcribe\", async (c) => {\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleTranscribe({\n runtime,\n request,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .get(\"/threads\", async (c) => {\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleListThreads({\n runtime,\n request,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .get(\"/threads/:threadId\", async (c) => {\n const threadId = c.req.param(\"threadId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleGetThread({\n runtime,\n request,\n threadId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .delete(\"/threads/:threadId\", async (c) => {\n const threadId = c.req.param(\"threadId\");\n const request = c.get(\"modifiedRequest\") || c.req.raw;\n\n try {\n return await handleDeleteThread({\n runtime,\n request,\n threadId,\n });\n } catch (error) {\n logger.error({ err: error, url: request.url, path: c.req.path }, \"Error running request handler\");\n throw error;\n }\n })\n .notFound((c) => {\n return c.json({ error: \"Not found\" }, 404);\n });\n\n // return app;\n}\n","import { AbstractAgent, HttpAgent, RunAgentInput, RunAgentInputSchema } from \"@ag-ui/client\";\nimport { EventEncoder } from \"@ag-ui/encoder\";\nimport { CopilotRuntime } from \"../runtime\";\nimport { Subscription } from \"rxjs\";\n\ninterface RunAgentParameters {\n request: Request;\n runtime: CopilotRuntime;\n agentId: string;\n}\n\nexport async function handleRunAgent({ runtime, request, agentId }: 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 shouldForward = (headerName: string) => {\n const lower = headerName.toLowerCase();\n return lower === \"authorization\" || lower.startsWith(\"x-\");\n };\n\n const forwardableHeaders: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n if (shouldForward(key)) {\n forwardableHeaders[key] = value;\n }\n });\n\n agent.headers = {\n ...(agent.headers as Record<string, string>),\n ...forwardableHeaders,\n };\n }\n\n const stream = new TransformStream();\n const writer = stream.writable.getWriter();\n const encoder = new EventEncoder();\n let streamClosed = false;\n let subscription: Subscription | undefined;\n let abortListener: (() => void) | undefined;\n\n const cleanupAbortListener = () => {\n if (abortListener) {\n request.signal.removeEventListener(\"abort\", abortListener);\n abortListener = undefined;\n }\n };\n\n const closeStream = async () => {\n if (!streamClosed) {\n try {\n await writer.close();\n } catch {\n // Stream already closed\n }\n streamClosed = true;\n }\n };\n\n // Process the request in the background\n (async () => {\n let input: RunAgentInput;\n try {\n const requestBody = await request.json();\n input = RunAgentInputSchema.parse(requestBody);\n } catch {\n return new Response(\n JSON.stringify({\n error: \"Invalid request body\",\n }),\n { status: 400 },\n );\n }\n\n // Parse client-declared resourceId from header\n const clientDeclared = CopilotRuntime[\"parseClientDeclaredResourceId\"](request);\n\n // Resolve resource scope (null is valid for admin bypass)\n const scope = await runtime.resolveThreadsScope({ request, clientDeclared });\n if (scope === undefined) {\n throw new Error(\"Unauthorized: No resource scope provided\");\n }\n\n agent.setMessages(input.messages);\n agent.setState(input.state);\n agent.threadId = input.threadId;\n\n const stopRunner = async () => {\n try {\n await runtime.runner.stop({ threadId: input.threadId });\n } catch (stopError) {\n console.error(\"Error stopping runner:\", stopError);\n }\n };\n\n subscription = runtime.runner\n .run({\n threadId: input.threadId,\n agent,\n input,\n scope,\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 cleanupAbortListener();\n await closeStream();\n },\n complete: async () => {\n cleanupAbortListener();\n await closeStream();\n },\n });\n\n const handleAbort = () => {\n subscription?.unsubscribe();\n subscription = undefined;\n cleanupAbortListener();\n void stopRunner();\n void closeStream();\n };\n\n if (request.signal.aborted) {\n handleAbort();\n } else {\n abortListener = handleAbort;\n request.signal.addEventListener(\"abort\", abortListener);\n }\n })().catch((error) => {\n console.error(\"Error running agent:\", error);\n console.error(\"Error stack:\", error instanceof Error ? error.stack : \"No stack trace\");\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 subscription?.unsubscribe();\n subscription = undefined;\n cleanupAbortListener();\n void closeStream();\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(\"Error stack:\", error instanceof Error ? error.stack : \"No stack trace\");\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 { 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\";\n\ninterface HandleTranscribeParameters {\n runtime: CopilotRuntime;\n request: Request;\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 return new Response(\n JSON.stringify({\n error: \"Transcription service not configured\",\n message:\n \"No transcription service has been configured in the runtime\",\n }),\n {\n status: 503,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Check if request has form data\n const contentType = request.headers.get(\"content-type\");\n if (!contentType || !contentType.includes(\"multipart/form-data\")) {\n return new Response(\n JSON.stringify({\n error: \"Invalid content type\",\n message:\n \"Request must contain multipart/form-data with an audio file\",\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Extract form data\n const formData = await request.formData();\n const audioFile = formData.get(\"audio\") as File | null;\n\n if (!audioFile || !(audioFile instanceof File)) {\n return new Response(\n JSON.stringify({\n error: \"Missing audio file\",\n message:\n \"No audio file found in form data. Please include an 'audio' field.\",\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Validate file type (basic check)\n const validAudioTypes = [\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\n // Allow empty types and application/octet-stream (common fallback for unknown types)\n const isValidType =\n validAudioTypes.includes(audioFile.type) ||\n audioFile.type === \"\" ||\n audioFile.type === \"application/octet-stream\";\n\n if (!isValidType) {\n return new Response(\n JSON.stringify({\n error: \"Invalid file type\",\n message: `Unsupported audio file type: ${audioFile.type}. Supported types: ${validAudioTypes.join(\", \")}, or files with unknown/empty types`,\n }),\n {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\n }\n\n // Transcribe the audio file with options\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 return new Response(\n JSON.stringify({\n error: \"Transcription failed\",\n message:\n error instanceof Error\n ? error.message\n : \"Unknown error occurred during transcription\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n }\n );\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","import { RunAgentInput, RunAgentInputSchema } from \"@ag-ui/client\";\nimport { EventEncoder } from \"@ag-ui/encoder\";\nimport { CopilotRuntime } from \"../runtime\";\nimport { Subscription } from \"rxjs\";\n\ninterface ConnectAgentParameters {\n request: Request;\n runtime: CopilotRuntime;\n agentId: string;\n}\n\nexport async function handleConnectAgent({ runtime, request, agentId }: 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 const stream = new TransformStream();\n const writer = stream.writable.getWriter();\n const encoder = new EventEncoder();\n let streamClosed = false;\n let subscription: Subscription | undefined;\n let abortListener: (() => void) | undefined;\n\n const cleanupAbortListener = () => {\n if (abortListener) {\n request.signal.removeEventListener(\"abort\", abortListener);\n abortListener = undefined;\n }\n };\n\n const closeStream = async () => {\n if (!streamClosed) {\n try {\n await writer.close();\n } catch {\n // Stream already closed\n }\n streamClosed = true;\n }\n };\n\n // Process the request in the background\n (async () => {\n let input: RunAgentInput;\n try {\n const requestBody = await request.json();\n input = RunAgentInputSchema.parse(requestBody);\n } catch {\n return new Response(\n JSON.stringify({\n error: \"Invalid request body\",\n }),\n { status: 400 },\n );\n }\n\n // Parse client-declared resourceId from header\n const clientDeclared = CopilotRuntime[\"parseClientDeclaredResourceId\"](request);\n\n // Resolve resource scope (null is valid for admin bypass)\n const scope = await runtime.resolveThreadsScope({ request, clientDeclared });\n if (scope === undefined) {\n throw new Error(\"Unauthorized: No resource scope provided\");\n }\n\n subscription = runtime.runner\n .connect({\n threadId: input.threadId,\n scope,\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 cleanupAbortListener();\n await closeStream();\n },\n complete: async () => {\n cleanupAbortListener();\n await closeStream();\n },\n });\n\n const handleAbort = () => {\n subscription?.unsubscribe();\n subscription = undefined;\n cleanupAbortListener();\n void closeStream();\n };\n\n if (request.signal.aborted) {\n handleAbort();\n } else {\n abortListener = handleAbort;\n request.signal.addEventListener(\"abort\", abortListener);\n }\n })().catch((error) => {\n console.error(\"Error running agent:\", error);\n console.error(\"Error stack:\", error instanceof Error ? error.stack : \"No stack trace\");\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 subscription?.unsubscribe();\n subscription = undefined;\n cleanupAbortListener();\n void closeStream();\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(\"Error stack:\", error instanceof Error ? error.stack : \"No stack trace\");\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 // Parse client-declared resourceId from header\n const clientDeclared = CopilotRuntime[\"parseClientDeclaredResourceId\"](request);\n\n // Resolve resource scope\n const scope = await runtime.resolveThreadsScope({ request, clientDeclared });\n\n // Guard against undefined scope (auth failure or missing return)\n if (scope === undefined) {\n return new Response(\n JSON.stringify({\n error: \"Unauthorized\",\n message: \"No resource scope provided\",\n }),\n {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n // Verify the thread belongs to this scope before stopping\n const runner = await runtime.runner;\n const metadata = await runner.getThreadMetadata(threadId, scope);\n\n if (!metadata) {\n // Return 404 (not 403) to prevent resource enumeration\n return new Response(\n JSON.stringify({\n error: \"Thread not found\",\n message: `Thread '${threadId}' does not exist or you don't have access`,\n }),\n {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const stopped = await 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\";\n\ninterface ListThreadsParameters {\n request: Request;\n runtime: CopilotRuntime;\n}\n\ninterface GetThreadParameters {\n request: Request;\n runtime: CopilotRuntime;\n threadId: string;\n}\n\ninterface DeleteThreadParameters {\n request: Request;\n runtime: CopilotRuntime;\n threadId: string;\n}\n\nexport async function handleListThreads({ runtime, request }: ListThreadsParameters) {\n try {\n // Parse client-declared resourceId from header\n const clientDeclared = CopilotRuntime[\"parseClientDeclaredResourceId\"](request);\n\n // Resolve resource scope\n const scope = await runtime.resolveThreadsScope({ request, clientDeclared });\n\n // Guard against undefined scope (auth failure or missing return)\n if (scope === undefined) {\n return new Response(\n JSON.stringify({\n error: \"Unauthorized\",\n message: \"No resource scope provided\",\n }),\n {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const url = new URL(request.url);\n const limitParam = url.searchParams.get(\"limit\");\n const offsetParam = url.searchParams.get(\"offset\");\n\n const parsedLimit = limitParam ? Number.parseInt(limitParam, 10) : NaN;\n const parsedOffset = offsetParam ? Number.parseInt(offsetParam, 10) : NaN;\n\n const limit = Math.max(1, Math.min(100, Number.isNaN(parsedLimit) ? 20 : parsedLimit));\n const offset = Math.max(0, Number.isNaN(parsedOffset) ? 0 : parsedOffset);\n\n const runner = await runtime.runner;\n const result = await runner.listThreads({ scope, limit, offset });\n\n return new Response(JSON.stringify(result), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\n return new Response(\n JSON.stringify({\n error: \"Failed to list threads\",\n message: errorMessage,\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n\nexport async function handleGetThread({ runtime, threadId, request }: GetThreadParameters) {\n try {\n // Parse client-declared resourceId from header\n const clientDeclared = CopilotRuntime[\"parseClientDeclaredResourceId\"](request);\n\n // Resolve resource scope\n const scope = await runtime.resolveThreadsScope({ request, clientDeclared });\n\n // Guard against undefined scope (auth failure or missing return)\n if (scope === undefined) {\n return new Response(\n JSON.stringify({\n error: \"Unauthorized\",\n message: \"No resource scope provided\",\n }),\n {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const runner = await runtime.runner;\n const metadata = await runner.getThreadMetadata(threadId, scope);\n\n if (!metadata) {\n // Return 404 (not 403) to prevent resource enumeration\n return new Response(\n JSON.stringify({\n error: \"Thread not found\",\n message: `Thread '${threadId}' does not exist`,\n }),\n {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n return new Response(JSON.stringify(metadata), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\n return new Response(\n JSON.stringify({\n error: \"Failed to get thread\",\n message: errorMessage,\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n\nexport async function handleDeleteThread({ runtime, threadId, request }: DeleteThreadParameters) {\n if (!threadId) {\n return new Response(JSON.stringify({ error: \"Thread ID required\" }), {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n try {\n // Parse client-declared resourceId from header\n const clientDeclared = CopilotRuntime[\"parseClientDeclaredResourceId\"](request);\n\n // Resolve resource scope\n const scope = await runtime.resolveThreadsScope({ request, clientDeclared });\n\n // Guard against undefined scope (auth failure or missing return)\n if (scope === undefined) {\n return new Response(\n JSON.stringify({\n error: \"Unauthorized\",\n message: \"No resource scope provided\",\n }),\n {\n status: 401,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n\n const runner = await runtime.runner;\n await runner.deleteThread(threadId, scope);\n\n return new Response(JSON.stringify({ success: true }), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error occurred\";\n\n return new Response(\n JSON.stringify({\n error: \"Failed to delete thread\",\n message: errorMessage,\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n}\n","export * from \"./agent-runner\";\nexport * from \"./in-memory\";\nexport { finalizeRunEvents } from \"@copilotkitnext/shared\";\n","import { ResourceScope } from \"./runner/agent-runner\";\n\n/**\n * Helper to validate that client-declared resourceId matches the authenticated user's resourceId.\n *\n * Throws an error if validation fails.\n *\n * @example\n * ```typescript\n * resolveThreadsScope: async ({ request, clientDeclared }) => {\n * const user = await authenticate(request);\n * validateResourceIdMatch(clientDeclared, user.id);\n * return { resourceId: user.id };\n * }\n * ```\n */\nexport function validateResourceIdMatch(\n clientDeclared: string | string[] | undefined,\n serverAuthorized: string | string[],\n): void {\n if (!clientDeclared) {\n return; // No client hint - OK\n }\n\n const clientIds = Array.isArray(clientDeclared) ? clientDeclared : [clientDeclared];\n const authorizedIds = Array.isArray(serverAuthorized) ? serverAuthorized : [serverAuthorized];\n\n // Check if ANY client-declared ID matches ANY authorized ID\n const hasMatch = clientIds.some((clientId) => authorizedIds.includes(clientId));\n\n if (!hasMatch) {\n throw new Error(\"Unauthorized: Client-declared resourceId does not match authenticated user\");\n }\n}\n\n/**\n * Helper to filter client-declared resourceIds to only those the user has access to.\n *\n * Returns the filtered resourceId(s), or throws if no valid IDs remain.\n *\n * @example\n * ```typescript\n * resolveThreadsScope: async ({ request, clientDeclared }) => {\n * const user = await authenticate(request);\n * const userResourceIds = await getUserAccessibleResources(user);\n * const resourceId = filterAuthorizedResourceIds(clientDeclared, userResourceIds);\n * return { resourceId };\n * }\n * ```\n */\nexport function filterAuthorizedResourceIds(\n clientDeclared: string | string[] | undefined,\n serverAuthorized: string | string[],\n): string | string[] {\n const authorizedIds = Array.isArray(serverAuthorized) ? serverAuthorized : [serverAuthorized];\n\n if (!clientDeclared) {\n // No client hint - return all authorized\n return serverAuthorized;\n }\n\n const clientIds = Array.isArray(clientDeclared) ? clientDeclared : [clientDeclared];\n\n // Filter to only authorized IDs\n const filtered = clientIds.filter((id) => authorizedIds.includes(id));\n\n if (filtered.length === 0) {\n throw new Error(\"Unauthorized: None of the client-declared resourceIds are authorized\");\n }\n\n // Return single string if originally single, otherwise array\n return Array.isArray(clientDeclared) ? filtered : filtered[0]!;\n}\n\n/**\n * Helper to create a strict thread scope resolver that only allows exact matches.\n *\n * Use this when you want to enforce that the client MUST declare the correct resourceId.\n *\n * @example\n * ```typescript\n * new CopilotRuntime({\n * agents: { myAgent },\n * resolveThreadsScope: createStrictThreadScopeResolver(async (request) => {\n * const user = await authenticate(request);\n * return user.id;\n * })\n * });\n * ```\n */\nexport function createStrictThreadScopeResolver(\n getUserId: (request: Request) => Promise<string | string[]>,\n): (context: { request: Request; clientDeclared?: string | string[] }) => Promise<ResourceScope> {\n return async ({ request, clientDeclared }) => {\n const userId = await getUserId(request);\n validateResourceIdMatch(clientDeclared, userId);\n return { resourceId: userId };\n };\n}\n\n/**\n * Helper to create a filtering thread scope resolver for multi-resource scenarios.\n *\n * Use this when users have access to multiple resources (e.g., multiple workspaces).\n *\n * @example\n * ```typescript\n * new CopilotRuntime({\n * agents: { myAgent },\n * resolveThreadsScope: createFilteringThreadScopeResolver(async (request) => {\n * const user = await authenticate(request);\n * return await getUserAccessibleWorkspaces(user);\n * })\n * });\n * ```\n */\nexport function createFilteringThreadScopeResolver(\n getUserResourceIds: (request: Request) => Promise<string[]>,\n): (context: { request: Request; clientDeclared?: string | string[] }) => Promise<ResourceScope> {\n return async ({ request, clientDeclared }) => {\n const userResourceIds = await getUserResourceIds(request);\n const resourceId = filterAuthorizedResourceIds(clientDeclared, userResourceIds);\n return { resourceId };\n };\n}\n"],"mappings":"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","names":["logger","logger","logger","RunAgentInputSchema","EventEncoder","EventEncoder","RunAgentInputSchema","EventType","logger","finalizeRunEvents"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@copilotkitnext/runtime",
3
- "version": "0.0.18",
3
+ "version": "0.0.19-threads-and-attachements.0",
4
4
  "description": "Server-side runtime package for CopilotKit2",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -25,9 +25,9 @@
25
25
  "@copilotkitnext/eslint-config": "0.0.0"
26
26
  },
27
27
  "dependencies": {
28
- "@ag-ui/client": "0.0.40-alpha.6",
29
- "@ag-ui/core": "0.0.40-alpha.6",
30
- "@ag-ui/encoder": "0.0.40-alpha.6",
28
+ "@ag-ui/client": "0.0.40-alpha.7",
29
+ "@ag-ui/core": "0.0.40-alpha.7",
30
+ "@ag-ui/encoder": "0.0.40-alpha.7",
31
31
  "hono": "^4.6.13",
32
32
  "rxjs": "7.8.1",
33
33
  "@copilotkitnext/shared": "0.0.18"