@copilotkitnext/runtime 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/runner/agent-runner.ts","../src/runner/in-memory.ts","../src/runner/event-compaction.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/runner/sqlite.ts","../src/runner/enterprise.ts"],"sourcesContent":["{\n \"name\": \"@copilotkitnext/runtime\",\n \"version\": \"0.0.10\",\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/better-sqlite3\": \"^7.6.13\",\n \"@types/node\": \"^22.15.3\",\n \"better-sqlite3\": \"^12.2.0\",\n \"eslint\": \"^9.30.0\",\n \"ioredis-mock\": \"^8.9.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.38-alpha.2\",\n \"@ag-ui/core\": \"0.0.38-alpha.2\",\n \"@ag-ui/encoder\": \"0.0.38-alpha.2\",\n \"@copilotkitnext/shared\": \"workspace:*\",\n \"hono\": \"^4.6.13\",\n \"ioredis\": \"^5.7.0\",\n \"kysely\": \"^0.28.5\",\n \"rxjs\": \"7.8.1\"\n },\n \"peerDependencies\": {\n \"better-sqlite3\": \"^12.2.0\",\n \"openai\": \"^5.9.0\"\n },\n \"peerDependenciesMeta\": {\n \"better-sqlite3\": {\n \"optional\": true\n }\n },\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 BaseEvent,\n Message,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n MessagesSnapshotEvent,\n} from \"@ag-ui/client\";\nimport { compactEvents } from \"./event-compaction\";\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 /** Lets stop() cancel the current producer. */\n abortController = new AbortController();\n\n /** Current run ID */\n currentRunId: string | null = null;\n\n /** Historic completed runs */\n historicRuns: HistoricRun[] = [];\n}\n\nconst GLOBAL_STORE = new Map<string, InMemoryEventStore>();\n\nexport class InMemoryAgentRunner extends AgentRunner {\n private convertMessageToEvents(message: Message): BaseEvent[] {\n const events: BaseEvent[] = [];\n\n if (\n (message.role === \"assistant\" ||\n message.role === \"user\" ||\n message.role === \"developer\" ||\n message.role === \"system\") &&\n message.content\n ) {\n const textStartEvent: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: message.id,\n role: message.role,\n };\n events.push(textStartEvent);\n\n const textContentEvent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: message.id,\n delta: message.content,\n };\n events.push(textContentEvent);\n\n const textEndEvent: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: message.id,\n };\n events.push(textEndEvent);\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n const toolStartEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCall.id,\n toolCallName: toolCall.function.name,\n parentMessageId: message.id,\n };\n events.push(toolStartEvent);\n\n const toolArgsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCall.id,\n delta: toolCall.function.arguments,\n };\n events.push(toolArgsEvent);\n\n const toolEndEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n };\n events.push(toolEndEvent);\n }\n }\n\n if (message.role === \"tool\" && message.toolCallId) {\n const toolResultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n messageId: message.id,\n toolCallId: message.toolCallId,\n content: message.content,\n role: \"tool\",\n };\n events.push(toolResultEvent);\n }\n\n return events;\n }\n\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\n // Track seen message IDs and current run events for this run\n const seenMessageIds = new Set<string>();\n const currentRunEvents: BaseEvent[] = [];\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 }\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 store.abortController = new AbortController();\n\n // Create a subject for run() return value\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\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 runSubject.next(event); // For run() return - only agent events\n nextSubject.next(event); // For connect() / store - all events\n currentRunEvents.push(event); // 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 // Process input messages (same logic as SQLite)\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 const events = this.convertMessageToEvents(message);\n\n // Check if this message is NEW (not in historic runs)\n const isNewMessage = !historicMessageIds.has(message.id);\n\n for (const event of events) {\n // Always emit to stream for context\n nextSubject.next(event);\n\n // Store if this is a NEW message for this run\n if (isNewMessage) {\n currentRunEvents.push(event);\n }\n }\n }\n }\n }\n },\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.isRunning = false;\n store.currentRunId = null;\n runSubject.complete();\n nextSubject.complete();\n } catch {\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.isRunning = false;\n store.currentRunId = null;\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) {\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stop(_request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import {\n BaseEvent,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n} from \"@ag-ui/client\";\n\n/**\n * Compacts streaming events by consolidating multiple deltas into single events.\n * For text messages: multiple content deltas become one concatenated delta.\n * For tool calls: multiple args deltas become one concatenated delta.\n * Events between related streaming events are reordered to keep streaming events together.\n * \n * @param events - Array of events to compact\n * @returns Compacted array of events\n */\nexport function compactEvents(events: BaseEvent[]): BaseEvent[] {\n const compacted: BaseEvent[] = [];\n const pendingTextMessages = new Map<string, {\n start?: TextMessageStartEvent;\n contents: TextMessageContentEvent[];\n end?: TextMessageEndEvent;\n otherEvents: BaseEvent[];\n }>();\n const pendingToolCalls = new Map<string, {\n start?: ToolCallStartEvent;\n args: ToolCallArgsEvent[];\n end?: ToolCallEndEvent;\n otherEvents: BaseEvent[];\n }>();\n\n for (const event of events) {\n // Handle text message streaming events\n if (event.type === EventType.TEXT_MESSAGE_START) {\n const startEvent = event as TextMessageStartEvent;\n const messageId = startEvent.messageId;\n \n if (!pendingTextMessages.has(messageId)) {\n pendingTextMessages.set(messageId, {\n contents: [],\n otherEvents: []\n });\n }\n \n const pending = pendingTextMessages.get(messageId)!;\n pending.start = startEvent;\n } else if (event.type === EventType.TEXT_MESSAGE_CONTENT) {\n const contentEvent = event as TextMessageContentEvent;\n const messageId = contentEvent.messageId;\n \n if (!pendingTextMessages.has(messageId)) {\n pendingTextMessages.set(messageId, {\n contents: [],\n otherEvents: []\n });\n }\n \n const pending = pendingTextMessages.get(messageId)!;\n pending.contents.push(contentEvent);\n } else if (event.type === EventType.TEXT_MESSAGE_END) {\n const endEvent = event as TextMessageEndEvent;\n const messageId = endEvent.messageId;\n \n if (!pendingTextMessages.has(messageId)) {\n pendingTextMessages.set(messageId, {\n contents: [],\n otherEvents: []\n });\n }\n \n const pending = pendingTextMessages.get(messageId)!;\n pending.end = endEvent;\n \n // Flush this message's events\n flushTextMessage(messageId, pending, compacted);\n pendingTextMessages.delete(messageId);\n } else if (event.type === EventType.TOOL_CALL_START) {\n const startEvent = event as ToolCallStartEvent;\n const toolCallId = startEvent.toolCallId;\n \n if (!pendingToolCalls.has(toolCallId)) {\n pendingToolCalls.set(toolCallId, {\n args: [],\n otherEvents: []\n });\n }\n \n const pending = pendingToolCalls.get(toolCallId)!;\n pending.start = startEvent;\n } else if (event.type === EventType.TOOL_CALL_ARGS) {\n const argsEvent = event as ToolCallArgsEvent;\n const toolCallId = argsEvent.toolCallId;\n \n if (!pendingToolCalls.has(toolCallId)) {\n pendingToolCalls.set(toolCallId, {\n args: [],\n otherEvents: []\n });\n }\n \n const pending = pendingToolCalls.get(toolCallId)!;\n pending.args.push(argsEvent);\n } else if (event.type === EventType.TOOL_CALL_END) {\n const endEvent = event as ToolCallEndEvent;\n const toolCallId = endEvent.toolCallId;\n \n if (!pendingToolCalls.has(toolCallId)) {\n pendingToolCalls.set(toolCallId, {\n args: [],\n otherEvents: []\n });\n }\n \n const pending = pendingToolCalls.get(toolCallId)!;\n pending.end = endEvent;\n \n // Flush this tool call's events\n flushToolCall(toolCallId, pending, compacted);\n pendingToolCalls.delete(toolCallId);\n } else {\n // For non-streaming events, check if we're in the middle of any streaming sequences\n let addedToBuffer = false;\n \n // Check text messages\n for (const [messageId, pending] of pendingTextMessages) {\n // If we have a start but no end yet, this event is \"in between\"\n if (pending.start && !pending.end) {\n pending.otherEvents.push(event);\n addedToBuffer = true;\n break;\n }\n }\n \n // Check tool calls if not already buffered\n if (!addedToBuffer) {\n for (const [toolCallId, pending] of pendingToolCalls) {\n // If we have a start but no end yet, this event is \"in between\"\n if (pending.start && !pending.end) {\n pending.otherEvents.push(event);\n addedToBuffer = true;\n break;\n }\n }\n }\n \n // If not in the middle of any streaming sequence, add directly to compacted\n if (!addedToBuffer) {\n compacted.push(event);\n }\n }\n }\n\n // Flush any remaining incomplete messages\n for (const [messageId, pending] of pendingTextMessages) {\n flushTextMessage(messageId, pending, compacted);\n }\n \n // Flush any remaining incomplete tool calls\n for (const [toolCallId, pending] of pendingToolCalls) {\n flushToolCall(toolCallId, pending, compacted);\n }\n\n return compacted;\n}\n\nfunction flushTextMessage(\n messageId: string,\n pending: {\n start?: TextMessageStartEvent;\n contents: TextMessageContentEvent[];\n end?: TextMessageEndEvent;\n otherEvents: BaseEvent[];\n },\n compacted: BaseEvent[]\n): void {\n // Add start event if present\n if (pending.start) {\n compacted.push(pending.start);\n }\n\n // Compact all content events into one\n if (pending.contents.length > 0) {\n const concatenatedDelta = pending.contents\n .map(c => c.delta)\n .join('');\n \n const compactedContent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: messageId,\n delta: concatenatedDelta,\n };\n \n compacted.push(compactedContent);\n }\n\n // Add end event if present\n if (pending.end) {\n compacted.push(pending.end);\n }\n\n // Add any events that were in between\n for (const otherEvent of pending.otherEvents) {\n compacted.push(otherEvent);\n }\n}\n\nfunction flushToolCall(\n toolCallId: string,\n pending: {\n start?: ToolCallStartEvent;\n args: ToolCallArgsEvent[];\n end?: ToolCallEndEvent;\n otherEvents: BaseEvent[];\n },\n compacted: BaseEvent[]\n): void {\n // Add start event if present\n if (pending.start) {\n compacted.push(pending.start);\n }\n\n // Compact all args events into one\n if (pending.args.length > 0) {\n const concatenatedArgs = pending.args\n .map(a => a.delta)\n .join('');\n \n const compactedArgs: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCallId,\n delta: concatenatedArgs,\n };\n \n compacted.push(compactedArgs);\n }\n\n // Add end event if present\n if (pending.end) {\n compacted.push(pending.end);\n }\n\n // Add any events that were in between\n for (const otherEvent of pending.otherEvents) {\n compacted.push(otherEvent);\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 { 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 {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"./middleware\";\nimport { handleConnectAgent } from \"./handlers/handle-connect\";\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({\n runtime,\n basePath,\n}: CopilotEndpointParams) {\n const app = new Hono<CopilotEndpointContext>();\n\n return app\n .basePath(basePath)\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(\n { err: error, url: request.url, path },\n \"Error running before request middleware\"\n );\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(\n { err: error, url: c.req.url, path },\n \"Error running after request middleware\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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 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 agent = agents[agentId].clone() as AbstractAgent;\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\n/** A string beginning with http:// or https:// that points to a webhook endpoint. */\nexport type MiddlewareURL = `${\"http\" | \"https\"}://${string}`;\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 | MiddlewareURL;\nexport type AfterRequestMiddleware = AfterRequestMiddlewareFn | MiddlewareURL;\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\nfunction isMiddlewareURL(value: unknown): value is MiddlewareURL {\n return typeof value === \"string\" && /^https?:\\/\\//.test(value);\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 // Webhook middleware\n if (isMiddlewareURL(mw)) {\n const clone = request.clone();\n const url = new URL(request.url);\n const headersObj: Record<string, string> = {};\n clone.headers.forEach((v, k) => {\n headersObj[k] = v;\n });\n let bodyJson: unknown = undefined;\n try {\n bodyJson = await clone.json();\n } catch {\n /* ignore */\n }\n\n const payload = {\n method: request.method,\n path: url.pathname,\n query: url.search.startsWith(\"?\") ? url.search.slice(1) : url.search,\n headers: headersObj,\n body: bodyJson,\n };\n\n const ac = new AbortController();\n const to = setTimeout(() => ac.abort(), 2000);\n let res: Response;\n try {\n res = await fetch(mw, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"X-CopilotKit-Webhook-Stage\": WebhookStage.BeforeRequest,\n },\n body: JSON.stringify(payload),\n signal: ac.signal,\n });\n } catch {\n clearTimeout(to);\n throw new Response(undefined, { status: 502 });\n }\n clearTimeout(to);\n\n if (res.status >= 500) {\n throw new Response(undefined, { status: 502 });\n }\n if (res.status >= 400) {\n const errBody = await res.text();\n throw new Response(errBody || null, {\n status: res.status,\n headers: {\n \"content-type\": res.headers.get(\"content-type\") || \"application/json\",\n },\n });\n }\n if (res.status === 204) return;\n\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n return;\n }\n\n if (json && typeof json === \"object\") {\n const { headers, body } = json as {\n headers?: Record<string, string>;\n body?: unknown;\n };\n const init: RequestInit = {\n method: request.method,\n };\n if (headers) {\n init.headers = headers;\n }\n // Only add body for non-GET/HEAD requests\n if (\n body !== undefined &&\n request.method !== \"GET\" &&\n request.method !== \"HEAD\"\n ) {\n init.body = JSON.stringify(body);\n }\n return new Request(request.url, init);\n }\n return;\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 if (isMiddlewareURL(mw)) {\n const clone = response.clone();\n const headersObj: Record<string, string> = {};\n clone.headers.forEach((v, k) => {\n headersObj[k] = v;\n });\n let body = \"\";\n try {\n body = await clone.text();\n } catch {\n /* ignore */\n }\n\n const payload = {\n status: clone.status,\n headers: headersObj,\n body,\n };\n\n const ac = new AbortController();\n const to = setTimeout(() => ac.abort(), 2000);\n let res: Response;\n try {\n res = await fetch(mw, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"X-CopilotKit-Webhook-Stage\": WebhookStage.AfterRequest,\n },\n body: JSON.stringify(payload),\n signal: ac.signal,\n });\n } finally {\n clearTimeout(to);\n }\n\n if (!res.ok) {\n throw new Error(\n `after_request webhook ${mw} responded with ${res.status}`\n );\n }\n return;\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 {\n AgentRunner,\n AgentRunnerConnectRequest,\n AgentRunnerIsRunningRequest,\n AgentRunnerRunRequest,\n type AgentRunnerStopRequest,\n} from \"./agent-runner\";\nimport { Observable, ReplaySubject } from \"rxjs\";\nimport {\n BaseEvent,\n RunAgentInput,\n Message,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n} from \"@ag-ui/client\";\nimport { compactEvents } from \"./event-compaction\";\nimport Database from \"better-sqlite3\";\n\nconst SCHEMA_VERSION = 1;\n\ninterface AgentRunRecord {\n id: number;\n thread_id: string;\n run_id: string;\n parent_run_id: string | null;\n events: BaseEvent[];\n input: RunAgentInput;\n created_at: number;\n version: number;\n}\n\nexport interface SqliteAgentRunnerOptions {\n dbPath?: string;\n}\n\n// Active connections for streaming events\n// This is the only in-memory state we need - just for active streaming\nconst ACTIVE_CONNECTIONS = new Map<string, ReplaySubject<BaseEvent>>();\n\nexport class SqliteAgentRunner extends AgentRunner {\n private db: any;\n\n constructor(options: SqliteAgentRunnerOptions = {}) {\n super();\n const dbPath = options.dbPath ?? \":memory:\";\n \n if (!Database) {\n throw new Error(\n 'better-sqlite3 is required for SqliteAgentRunner but was not found.\\n' +\n 'Please install it in your project:\\n' +\n ' npm install better-sqlite3\\n' +\n ' or\\n' +\n ' pnpm add better-sqlite3\\n' +\n ' or\\n' +\n ' yarn add better-sqlite3\\n\\n' +\n 'If you don\\'t need persistence, use InMemoryAgentRunner instead.'\n );\n }\n \n this.db = new Database(dbPath);\n this.initializeSchema();\n }\n\n private convertMessageToEvents(message: Message): BaseEvent[] {\n const events: BaseEvent[] = [];\n\n if (\n (message.role === \"assistant\" ||\n message.role === \"user\" ||\n message.role === \"developer\" ||\n message.role === \"system\") &&\n message.content\n ) {\n const textStartEvent: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: message.id,\n role: message.role,\n };\n events.push(textStartEvent);\n\n const textContentEvent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: message.id,\n delta: message.content,\n };\n events.push(textContentEvent);\n\n const textEndEvent: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: message.id,\n };\n events.push(textEndEvent);\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n const toolStartEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCall.id,\n toolCallName: toolCall.function.name,\n parentMessageId: message.id,\n };\n events.push(toolStartEvent);\n\n const toolArgsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCall.id,\n delta: toolCall.function.arguments,\n };\n events.push(toolArgsEvent);\n\n const toolEndEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n };\n events.push(toolEndEvent);\n }\n }\n\n if (message.role === \"tool\" && message.toolCallId) {\n const toolResultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n messageId: message.id,\n toolCallId: message.toolCallId,\n content: message.content,\n role: \"tool\",\n };\n events.push(toolResultEvent);\n }\n\n return events;\n }\n\n private initializeSchema(): void {\n // Create the agent_runs table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS agent_runs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n thread_id TEXT NOT NULL,\n run_id TEXT NOT NULL UNIQUE,\n parent_run_id TEXT,\n events TEXT NOT NULL,\n input TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n version INTEGER NOT NULL\n )\n `);\n\n // Create run_state table to track active runs\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS run_state (\n thread_id TEXT PRIMARY KEY,\n is_running INTEGER DEFAULT 0,\n current_run_id TEXT,\n updated_at INTEGER NOT NULL\n )\n `);\n\n // Create indexes for efficient queries\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_thread_id ON agent_runs(thread_id);\n CREATE INDEX IF NOT EXISTS idx_parent_run_id ON agent_runs(parent_run_id);\n `);\n\n // Create schema version table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL\n )\n `);\n\n // Check and set schema version\n const currentVersion = this.db\n .prepare(\"SELECT version FROM schema_version ORDER BY version DESC LIMIT 1\")\n .get() as { version: number } | undefined;\n\n if (!currentVersion || currentVersion.version < SCHEMA_VERSION) {\n this.db\n .prepare(\"INSERT OR REPLACE INTO schema_version (version, applied_at) VALUES (?, ?)\")\n .run(SCHEMA_VERSION, Date.now());\n }\n }\n\n private storeRun(\n threadId: string,\n runId: string,\n events: BaseEvent[],\n input: RunAgentInput,\n parentRunId?: string | null\n ): void {\n // Compact ONLY the events from this run\n const compactedEvents = compactEvents(events);\n \n const stmt = this.db.prepare(`\n INSERT INTO agent_runs (thread_id, run_id, parent_run_id, events, input, created_at, version)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n threadId,\n runId,\n parentRunId ?? null,\n JSON.stringify(compactedEvents), // Store only this run's compacted events\n JSON.stringify(input),\n Date.now(),\n SCHEMA_VERSION\n );\n }\n\n private getHistoricRuns(threadId: string): AgentRunRecord[] {\n const stmt = this.db.prepare(`\n WITH RECURSIVE run_chain AS (\n -- Base case: find the root runs (those without parent)\n SELECT * FROM agent_runs \n WHERE thread_id = ? AND parent_run_id IS NULL\n \n UNION ALL\n \n -- Recursive case: find children of current level\n SELECT ar.* FROM agent_runs ar\n INNER JOIN run_chain rc ON ar.parent_run_id = rc.run_id\n WHERE ar.thread_id = ?\n )\n SELECT * FROM run_chain\n ORDER BY created_at ASC\n `);\n\n const rows = stmt.all(threadId, threadId) as any[];\n \n return rows.map(row => ({\n id: row.id,\n thread_id: row.thread_id,\n run_id: row.run_id,\n parent_run_id: row.parent_run_id,\n events: JSON.parse(row.events),\n input: JSON.parse(row.input),\n created_at: row.created_at,\n version: row.version\n }));\n }\n\n private getLatestRunId(threadId: string): string | null {\n const stmt = this.db.prepare(`\n SELECT run_id FROM agent_runs \n WHERE thread_id = ? \n ORDER BY created_at DESC \n LIMIT 1\n `);\n\n const result = stmt.get(threadId) as { run_id: string } | undefined;\n return result?.run_id ?? null;\n }\n\n private setRunState(threadId: string, isRunning: boolean, runId?: string): void {\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO run_state (thread_id, is_running, current_run_id, updated_at)\n VALUES (?, ?, ?, ?)\n `);\n stmt.run(threadId, isRunning ? 1 : 0, runId ?? null, Date.now());\n }\n\n private getRunState(threadId: string): { isRunning: boolean; currentRunId: string | null } {\n const stmt = this.db.prepare(`\n SELECT is_running, current_run_id FROM run_state WHERE thread_id = ?\n `);\n const result = stmt.get(threadId) as { is_running: number; current_run_id: string | null } | undefined;\n \n return {\n isRunning: result?.is_running === 1,\n currentRunId: result?.current_run_id ?? null\n };\n }\n\n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n // Check if thread is already running in database\n const runState = this.getRunState(request.threadId);\n if (runState.isRunning) {\n throw new Error(\"Thread already running\");\n }\n\n // Mark thread as running in database\n this.setRunState(request.threadId, true, request.input.runId);\n\n // Track seen message IDs and current run events in memory for this run\n const seenMessageIds = new Set<string>();\n const currentRunEvents: BaseEvent[] = [];\n \n // Get all previously seen message IDs from historic runs\n const historicRuns = this.getHistoricRuns(request.threadId);\n const historicMessageIds = new Set<string>();\n for (const run of historicRuns) {\n for (const event of run.events) {\n if ('messageId' in event && typeof event.messageId === 'string') {\n historicMessageIds.add(event.messageId);\n }\n }\n }\n\n // Get or create subject for this thread's connections\n const nextSubject = new ReplaySubject<BaseEvent>(Infinity);\n const prevSubject = ACTIVE_CONNECTIONS.get(request.threadId);\n \n // Update the active connection for this thread\n ACTIVE_CONNECTIONS.set(request.threadId, nextSubject);\n\n // Create a subject for run() return value\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\n\n // Helper function to run the agent and handle errors\n const runAgent = async () => {\n // Get parent run ID for chaining\n const parentRunId = this.getLatestRunId(request.threadId);\n \n try {\n await request.agent.runAgent(request.input, {\n onEvent: ({ event }) => {\n runSubject.next(event); // For run() return - only agent events\n nextSubject.next(event); // For connect() / store - all events\n currentRunEvents.push(event); // Accumulate for database 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 // Process input messages\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 const events = this.convertMessageToEvents(message);\n \n // Check if this message is NEW (not in historic runs)\n const isNewMessage = !historicMessageIds.has(message.id);\n \n for (const event of events) {\n // Always emit to stream for context\n nextSubject.next(event);\n \n // Store if this is a NEW message for this run\n if (isNewMessage) {\n currentRunEvents.push(event);\n }\n }\n }\n }\n }\n },\n });\n \n // Store the run in database\n this.storeRun(\n request.threadId,\n request.input.runId,\n currentRunEvents,\n request.input,\n parentRunId\n );\n \n // Mark run as complete in database\n this.setRunState(request.threadId, false);\n \n // Complete the subjects\n runSubject.complete();\n nextSubject.complete();\n } catch {\n // Store the run even if it failed (partial events)\n if (currentRunEvents.length > 0) {\n this.storeRun(\n request.threadId,\n request.input.runId,\n currentRunEvents,\n request.input,\n parentRunId\n );\n }\n \n // Mark run as complete in database\n this.setRunState(request.threadId, false);\n \n // Don't emit error to the subject, just complete it\n // This allows subscribers to get events emitted before the error\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 connectionSubject = new ReplaySubject<BaseEvent>(Infinity);\n\n // Load historic runs from database\n const historicRuns = this.getHistoricRuns(request.threadId);\n \n // Collect all historic events from database\n const allHistoricEvents: BaseEvent[] = [];\n for (const run of historicRuns) {\n allHistoricEvents.push(...run.events);\n }\n \n // Compact all events together before emitting\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 const activeSubject = ACTIVE_CONNECTIONS.get(request.threadId);\n const runState = this.getRunState(request.threadId);\n \n if (activeSubject && runState.isRunning) {\n activeSubject.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 runState = this.getRunState(request.threadId);\n return Promise.resolve(runState.isRunning);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stop(_request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n throw new Error(\"Method not implemented.\");\n }\n\n /**\n * Close the database connection (for cleanup)\n */\n close(): void {\n if (this.db) {\n this.db.close();\n }\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 BaseEvent,\n RunAgentInput,\n Message,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n} from \"@ag-ui/client\";\nimport { compactEvents } from \"./event-compaction\";\nimport { Kysely, Generated } from \"kysely\";\nimport { Redis } from \"ioredis\";\n\nconst SCHEMA_VERSION = 1;\n\ninterface AgentDatabase {\n agent_runs: {\n id: Generated<number>;\n thread_id: string;\n run_id: string;\n parent_run_id: string | null;\n events: string;\n input: string;\n created_at: number;\n version: number;\n };\n \n run_state: {\n thread_id: string;\n is_running: number;\n current_run_id: string | null;\n server_id: string | null;\n updated_at: number;\n };\n \n schema_version: {\n version: number;\n applied_at: number;\n };\n}\n\ninterface AgentRunRecord {\n id: number;\n thread_id: string;\n run_id: string;\n parent_run_id: string | null;\n events: string;\n input: string;\n created_at: number;\n version: number;\n}\n\nconst redisKeys = {\n stream: (threadId: string, runId: string) => `stream:${threadId}:${runId}`,\n active: (threadId: string) => `active:${threadId}`,\n lock: (threadId: string) => `lock:${threadId}`,\n};\n\nexport interface EnterpriseAgentRunnerOptions {\n kysely: Kysely<AgentDatabase>;\n redis: Redis;\n redisSub?: Redis;\n streamRetentionMs?: number;\n streamActiveTTLMs?: number;\n lockTTLMs?: number;\n serverId?: string;\n}\n\nexport class EnterpriseAgentRunner extends AgentRunner {\n private db: Kysely<AgentDatabase>;\n public redis: Redis;\n public redisSub: Redis;\n private serverId: string;\n private streamRetentionMs: number;\n private streamActiveTTLMs: number;\n private lockTTLMs: number;\n \n constructor(options: EnterpriseAgentRunnerOptions) {\n super();\n this.db = options.kysely;\n this.redis = options.redis;\n this.redisSub = options.redisSub || options.redis.duplicate();\n this.serverId = options.serverId || this.generateServerId();\n this.streamRetentionMs = options.streamRetentionMs ?? 3600000; // 1 hour\n this.streamActiveTTLMs = options.streamActiveTTLMs ?? 300000; // 5 minutes\n this.lockTTLMs = options.lockTTLMs ?? 300000; // 5 minutes\n \n this.initializeSchema();\n }\n \n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\n \n const executeRun = async () => {\n const { threadId, input, agent } = request;\n const runId = input.runId;\n const streamKey = redisKeys.stream(threadId, runId);\n \n // Check if thread already running (do this check synchronously for consistency with SQLite)\n // For now we'll just check after, but in production you might want a sync check\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n if (activeRunId) {\n throw new Error(\"Thread already running\");\n }\n \n // Acquire distributed lock\n const lockAcquired = await this.redis.set(\n redisKeys.lock(threadId),\n this.serverId,\n 'PX', this.lockTTLMs,\n 'NX'\n );\n \n if (!lockAcquired) {\n throw new Error(\"Thread already running\");\n }\n \n // Mark as active\n await this.redis.setex(\n redisKeys.active(threadId),\n Math.floor(this.lockTTLMs / 1000),\n runId\n );\n \n // Update database state\n await this.setRunState(threadId, true, runId);\n \n // Track events and message IDs\n const currentRunEvents: BaseEvent[] = [];\n const seenMessageIds = new Set<string>();\n \n // Get historic message IDs\n const historicRuns = await this.getHistoricRuns(threadId);\n const historicMessageIds = new Set<string>();\n for (const run of historicRuns) {\n const events = JSON.parse(run.events) as BaseEvent[];\n for (const event of events) {\n if ('messageId' in event && typeof event.messageId === 'string') {\n historicMessageIds.add(event.messageId);\n }\n }\n }\n \n const parentRunId = historicRuns[historicRuns.length - 1]?.run_id ?? null;\n \n try {\n await agent.runAgent(input, {\n onEvent: async ({ event }) => {\n // Emit to run() caller\n runSubject.next(event);\n \n // Collect for database\n currentRunEvents.push(event);\n \n // Stream to Redis for connect() subscribers\n await this.redis.xadd(\n streamKey,\n 'MAXLEN', '~', '10000',\n '*',\n 'type', event.type,\n 'data', JSON.stringify(event)\n );\n \n // Refresh TTL with sliding window during active writes\n await this.redis.pexpire(streamKey, this.streamActiveTTLMs);\n \n // Check for completion events\n if (event.type === EventType.RUN_FINISHED || \n event.type === EventType.RUN_ERROR) {\n // Switch to retention TTL for late readers\n await this.redis.pexpire(streamKey, this.streamRetentionMs);\n }\n },\n \n onNewMessage: ({ message }) => {\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n },\n \n onRunStartedEvent: async () => {\n // Process input messages\n if (input.messages) {\n for (const message of input.messages) {\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n const events = this.convertMessageToEvents(message);\n const isNewMessage = !historicMessageIds.has(message.id);\n \n for (const event of events) {\n // Stream to Redis for context\n await this.redis.xadd(\n streamKey,\n 'MAXLEN', '~', '10000',\n '*',\n 'type', event.type,\n 'data', JSON.stringify(event)\n );\n \n if (isNewMessage) {\n currentRunEvents.push(event);\n }\n }\n }\n }\n }\n \n // Refresh TTL\n await this.redis.pexpire(streamKey, this.streamActiveTTLMs);\n },\n });\n \n // Store to database\n const compactedEvents = compactEvents(currentRunEvents);\n await this.storeRun(threadId, runId, compactedEvents, input, parentRunId);\n \n } finally {\n // Clean up (even on error)\n await this.setRunState(threadId, false);\n await this.redis.del(redisKeys.active(threadId));\n await this.redis.del(redisKeys.lock(threadId));\n \n // Ensure stream has retention TTL for late readers\n const exists = await this.redis.exists(streamKey);\n if (exists) {\n await this.redis.pexpire(streamKey, this.streamRetentionMs);\n }\n \n runSubject.complete();\n }\n };\n \n executeRun().catch((error) => {\n runSubject.error(error);\n });\n \n return runSubject.asObservable();\n }\n \n connect(request: AgentRunnerConnectRequest): Observable<BaseEvent> {\n const connectionSubject = new ReplaySubject<BaseEvent>(Infinity);\n \n const streamConnection = async () => {\n const { threadId } = request;\n \n // Load and emit historic runs from database\n const historicRuns = await this.getHistoricRuns(threadId);\n const allHistoricEvents: BaseEvent[] = [];\n \n for (const run of historicRuns) {\n const events = JSON.parse(run.events) as BaseEvent[];\n allHistoricEvents.push(...events);\n }\n \n // Compact and emit historic events\n const compactedEvents = compactEvents(allHistoricEvents);\n const emittedMessageIds = new Set<string>();\n \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 // Check for active run\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n \n if (activeRunId) {\n // Tail the run-specific Redis stream\n const streamKey = redisKeys.stream(threadId, activeRunId);\n let lastId = '0-0';\n let consecutiveEmptyReads = 0;\n \n while (true) {\n try {\n // Read with blocking using call method for better compatibility\n const result = await this.redis.call(\n 'XREAD',\n 'BLOCK', '5000',\n 'COUNT', '100',\n 'STREAMS', streamKey, lastId\n ) as [string, [string, string[]][]][] | null;\n \n if (!result || result.length === 0) {\n consecutiveEmptyReads++;\n \n // Check if stream still exists\n const exists = await this.redis.exists(streamKey);\n if (!exists) {\n // Stream expired, we're done\n break;\n }\n \n // Check if thread still active\n const stillActive = await this.redis.get(redisKeys.active(threadId));\n if (stillActive !== activeRunId) {\n // Different run started or thread stopped\n break;\n }\n \n // After multiple empty reads, assume completion\n if (consecutiveEmptyReads > 3) {\n break;\n }\n \n continue;\n }\n \n consecutiveEmptyReads = 0;\n const [, messages] = result[0] || [null, []];\n \n for (const [id, fields] of messages || []) {\n lastId = id;\n \n // Extract event data (fields is array: [key, value, key, value, ...])\n let eventData: string | null = null;\n let eventType: string | null = null;\n \n for (let i = 0; i < fields.length; i += 2) {\n if (fields[i] === 'data') {\n eventData = fields[i + 1] ?? null;\n } else if (fields[i] === 'type') {\n eventType = fields[i + 1] ?? null;\n }\n }\n \n if (eventData) {\n const event = JSON.parse(eventData) as BaseEvent;\n \n // Skip already emitted messages\n if ('messageId' in event && \n typeof event.messageId === 'string' && \n emittedMessageIds.has(event.messageId)) {\n continue;\n }\n \n connectionSubject.next(event);\n \n // Check for completion events\n if (eventType === EventType.RUN_FINISHED || \n eventType === EventType.RUN_ERROR) {\n connectionSubject.complete();\n return;\n }\n }\n }\n } catch {\n // Redis error, complete the stream\n break;\n }\n }\n }\n \n connectionSubject.complete();\n };\n \n streamConnection().catch(() => connectionSubject.complete());\n return connectionSubject.asObservable();\n }\n \n async isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean> {\n const { threadId } = request;\n \n // Check Redis first for speed\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n if (activeRunId) return true;\n \n // Check lock\n const lockExists = await this.redis.exists(redisKeys.lock(threadId));\n if (lockExists) return true;\n \n // Fallback to database\n const state = await this.db\n .selectFrom('run_state')\n .where('thread_id', '=', threadId)\n .selectAll()\n .executeTakeFirst();\n \n return state?.is_running === 1;\n }\n \n async stop(request: AgentRunnerStopRequest): Promise<boolean> {\n const { threadId } = request;\n \n // Get active run ID\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n if (!activeRunId) {\n return false;\n }\n \n // Add RUN_ERROR event to stream\n const streamKey = redisKeys.stream(threadId, activeRunId);\n await this.redis.xadd(\n streamKey,\n '*',\n 'type', EventType.RUN_ERROR,\n 'data', JSON.stringify({\n type: EventType.RUN_ERROR,\n error: 'Run stopped by user'\n })\n );\n \n // Set retention TTL\n await this.redis.pexpire(streamKey, this.streamRetentionMs);\n \n // Clean up\n await this.setRunState(threadId, false);\n await this.redis.del(redisKeys.active(threadId));\n await this.redis.del(redisKeys.lock(threadId));\n \n return true;\n }\n \n // Helper methods\n private convertMessageToEvents(message: Message): BaseEvent[] {\n const events: BaseEvent[] = [];\n\n if (\n (message.role === \"assistant\" ||\n message.role === \"user\" ||\n message.role === \"developer\" ||\n message.role === \"system\") &&\n message.content\n ) {\n const textStartEvent: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: message.id,\n role: message.role,\n };\n events.push(textStartEvent);\n\n const textContentEvent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: message.id,\n delta: message.content,\n };\n events.push(textContentEvent);\n\n const textEndEvent: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: message.id,\n };\n events.push(textEndEvent);\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n const toolStartEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCall.id,\n toolCallName: toolCall.function.name,\n parentMessageId: message.id,\n };\n events.push(toolStartEvent);\n\n const toolArgsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCall.id,\n delta: toolCall.function.arguments,\n };\n events.push(toolArgsEvent);\n\n const toolEndEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n };\n events.push(toolEndEvent);\n }\n }\n\n if (message.role === \"tool\" && message.toolCallId) {\n const toolResultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n messageId: message.id,\n toolCallId: message.toolCallId,\n content: message.content,\n role: \"tool\",\n };\n events.push(toolResultEvent);\n }\n\n return events;\n }\n \n private async initializeSchema(): Promise<void> {\n try {\n // Create agent_runs table\n await this.db.schema\n .createTable('agent_runs')\n .ifNotExists()\n .addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())\n .addColumn('thread_id', 'text', (col) => col.notNull())\n .addColumn('run_id', 'text', (col) => col.notNull().unique())\n .addColumn('parent_run_id', 'text')\n .addColumn('events', 'text', (col) => col.notNull())\n .addColumn('input', 'text', (col) => col.notNull())\n .addColumn('created_at', 'integer', (col) => col.notNull())\n .addColumn('version', 'integer', (col) => col.notNull())\n .execute()\n .catch(() => {}); // Ignore if already exists\n \n // Create run_state table\n await this.db.schema\n .createTable('run_state')\n .ifNotExists()\n .addColumn('thread_id', 'text', (col) => col.primaryKey())\n .addColumn('is_running', 'integer', (col) => col.defaultTo(0))\n .addColumn('current_run_id', 'text')\n .addColumn('server_id', 'text')\n .addColumn('updated_at', 'integer', (col) => col.notNull())\n .execute()\n .catch(() => {}); // Ignore if already exists\n \n // Create schema_version table\n await this.db.schema\n .createTable('schema_version')\n .ifNotExists()\n .addColumn('version', 'integer', (col) => col.primaryKey())\n .addColumn('applied_at', 'integer', (col) => col.notNull())\n .execute()\n .catch(() => {}); // Ignore if already exists\n \n // Create indexes\n await this.db.schema\n .createIndex('idx_thread_id')\n .ifNotExists()\n .on('agent_runs')\n .column('thread_id')\n .execute()\n .catch(() => {});\n \n await this.db.schema\n .createIndex('idx_parent_run_id')\n .ifNotExists()\n .on('agent_runs')\n .column('parent_run_id')\n .execute()\n .catch(() => {});\n \n // Check and set schema version\n const currentVersion = await this.db\n .selectFrom('schema_version')\n .orderBy('version', 'desc')\n .limit(1)\n .selectAll()\n .executeTakeFirst();\n \n if (!currentVersion || currentVersion.version < SCHEMA_VERSION) {\n await this.db\n .insertInto('schema_version')\n .values({\n version: SCHEMA_VERSION,\n applied_at: Date.now()\n })\n .onConflict((oc) => oc\n .column('version')\n .doUpdateSet({ applied_at: Date.now() })\n )\n .execute();\n }\n } catch {\n // Schema initialization might fail if DB is closed, ignore\n }\n }\n \n private async storeRun(\n threadId: string,\n runId: string,\n events: BaseEvent[],\n input: RunAgentInput,\n parentRunId: string | null\n ): Promise<void> {\n await this.db.insertInto('agent_runs')\n .values({\n thread_id: threadId,\n run_id: runId,\n parent_run_id: parentRunId,\n events: JSON.stringify(events),\n input: JSON.stringify(input),\n created_at: Date.now(),\n version: SCHEMA_VERSION\n })\n .execute();\n }\n \n private async getHistoricRuns(threadId: string): Promise<AgentRunRecord[]> {\n const rows = await this.db\n .selectFrom('agent_runs')\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'asc')\n .selectAll()\n .execute();\n \n return rows.map(row => ({\n id: Number(row.id),\n thread_id: row.thread_id,\n run_id: row.run_id,\n parent_run_id: row.parent_run_id,\n events: row.events,\n input: row.input,\n created_at: row.created_at,\n version: row.version\n }));\n }\n \n private async setRunState(\n threadId: string,\n isRunning: boolean,\n runId?: string\n ): Promise<void> {\n await this.db.insertInto('run_state')\n .values({\n thread_id: threadId,\n is_running: isRunning ? 1 : 0,\n current_run_id: runId ?? null,\n server_id: this.serverId,\n updated_at: Date.now()\n })\n .onConflict((oc) => oc\n .column('thread_id')\n .doUpdateSet({\n is_running: isRunning ? 1 : 0,\n current_run_id: runId ?? null,\n server_id: this.serverId,\n updated_at: Date.now()\n })\n )\n .execute();\n }\n \n async close(): Promise<void> {\n await this.db.destroy();\n this.redis.disconnect();\n this.redisSub.disconnect();\n }\n \n private generateServerId(): string {\n return `server-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}"],"mappings":"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","names":["EventType","EventType","logger","RunAgentInputSchema","EventEncoder","logger","ReplaySubject","EventType","EventType","ReplaySubject","ReplaySubject","EventType","SCHEMA_VERSION","ReplaySubject","EventType"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/runner/agent-runner.ts","../src/runner/in-memory.ts","../src/runner/event-compaction.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/runner/sqlite.ts","../src/runner/enterprise.ts"],"sourcesContent":["{\n \"name\": \"@copilotkitnext/runtime\",\n \"version\": \"0.0.11\",\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/better-sqlite3\": \"^7.6.13\",\n \"@types/node\": \"^22.15.3\",\n \"better-sqlite3\": \"^12.2.0\",\n \"eslint\": \"^9.30.0\",\n \"ioredis-mock\": \"^8.9.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.38-alpha.2\",\n \"@ag-ui/core\": \"0.0.38-alpha.2\",\n \"@ag-ui/encoder\": \"0.0.38-alpha.2\",\n \"@copilotkitnext/shared\": \"workspace:*\",\n \"hono\": \"^4.6.13\",\n \"ioredis\": \"^5.7.0\",\n \"kysely\": \"^0.28.5\",\n \"rxjs\": \"7.8.1\"\n },\n \"peerDependencies\": {\n \"better-sqlite3\": \"^12.2.0\",\n \"openai\": \"^5.9.0\"\n },\n \"peerDependenciesMeta\": {\n \"better-sqlite3\": {\n \"optional\": true\n }\n },\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 BaseEvent,\n Message,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n MessagesSnapshotEvent,\n} from \"@ag-ui/client\";\nimport { compactEvents } from \"./event-compaction\";\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 /** Lets stop() cancel the current producer. */\n abortController = new AbortController();\n\n /** Current run ID */\n currentRunId: string | null = null;\n\n /** Historic completed runs */\n historicRuns: HistoricRun[] = [];\n}\n\nconst GLOBAL_STORE = new Map<string, InMemoryEventStore>();\n\nexport class InMemoryAgentRunner extends AgentRunner {\n private convertMessageToEvents(message: Message): BaseEvent[] {\n const events: BaseEvent[] = [];\n\n if (\n (message.role === \"assistant\" ||\n message.role === \"user\" ||\n message.role === \"developer\" ||\n message.role === \"system\") &&\n message.content\n ) {\n const textStartEvent: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: message.id,\n role: message.role,\n };\n events.push(textStartEvent);\n\n const textContentEvent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: message.id,\n delta: message.content,\n };\n events.push(textContentEvent);\n\n const textEndEvent: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: message.id,\n };\n events.push(textEndEvent);\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n const toolStartEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCall.id,\n toolCallName: toolCall.function.name,\n parentMessageId: message.id,\n };\n events.push(toolStartEvent);\n\n const toolArgsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCall.id,\n delta: toolCall.function.arguments,\n };\n events.push(toolArgsEvent);\n\n const toolEndEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n };\n events.push(toolEndEvent);\n }\n }\n\n if (message.role === \"tool\" && message.toolCallId) {\n const toolResultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n messageId: message.id,\n toolCallId: message.toolCallId,\n content: message.content,\n role: \"tool\",\n };\n events.push(toolResultEvent);\n }\n\n return events;\n }\n\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\n // Track seen message IDs and current run events for this run\n const seenMessageIds = new Set<string>();\n const currentRunEvents: BaseEvent[] = [];\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 }\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 store.abortController = new AbortController();\n\n // Create a subject for run() return value\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\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 runSubject.next(event); // For run() return - only agent events\n nextSubject.next(event); // For connect() / store - all events\n currentRunEvents.push(event); // 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 // Process input messages (same logic as SQLite)\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 const events = this.convertMessageToEvents(message);\n\n // Check if this message is NEW (not in historic runs)\n const isNewMessage = !historicMessageIds.has(message.id);\n\n for (const event of events) {\n // Always emit to stream for context\n nextSubject.next(event);\n\n // Store if this is a NEW message for this run\n if (isNewMessage) {\n currentRunEvents.push(event);\n }\n }\n }\n }\n }\n },\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.isRunning = false;\n store.currentRunId = null;\n runSubject.complete();\n nextSubject.complete();\n } catch {\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.isRunning = false;\n store.currentRunId = null;\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) {\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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stop(_request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n throw new Error(\"Method not implemented.\");\n }\n}\n","import {\n BaseEvent,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n} from \"@ag-ui/client\";\n\n/**\n * Compacts streaming events by consolidating multiple deltas into single events.\n * For text messages: multiple content deltas become one concatenated delta.\n * For tool calls: multiple args deltas become one concatenated delta.\n * Events between related streaming events are reordered to keep streaming events together.\n * \n * @param events - Array of events to compact\n * @returns Compacted array of events\n */\nexport function compactEvents(events: BaseEvent[]): BaseEvent[] {\n const compacted: BaseEvent[] = [];\n const pendingTextMessages = new Map<string, {\n start?: TextMessageStartEvent;\n contents: TextMessageContentEvent[];\n end?: TextMessageEndEvent;\n otherEvents: BaseEvent[];\n }>();\n const pendingToolCalls = new Map<string, {\n start?: ToolCallStartEvent;\n args: ToolCallArgsEvent[];\n end?: ToolCallEndEvent;\n otherEvents: BaseEvent[];\n }>();\n\n for (const event of events) {\n // Handle text message streaming events\n if (event.type === EventType.TEXT_MESSAGE_START) {\n const startEvent = event as TextMessageStartEvent;\n const messageId = startEvent.messageId;\n \n if (!pendingTextMessages.has(messageId)) {\n pendingTextMessages.set(messageId, {\n contents: [],\n otherEvents: []\n });\n }\n \n const pending = pendingTextMessages.get(messageId)!;\n pending.start = startEvent;\n } else if (event.type === EventType.TEXT_MESSAGE_CONTENT) {\n const contentEvent = event as TextMessageContentEvent;\n const messageId = contentEvent.messageId;\n \n if (!pendingTextMessages.has(messageId)) {\n pendingTextMessages.set(messageId, {\n contents: [],\n otherEvents: []\n });\n }\n \n const pending = pendingTextMessages.get(messageId)!;\n pending.contents.push(contentEvent);\n } else if (event.type === EventType.TEXT_MESSAGE_END) {\n const endEvent = event as TextMessageEndEvent;\n const messageId = endEvent.messageId;\n \n if (!pendingTextMessages.has(messageId)) {\n pendingTextMessages.set(messageId, {\n contents: [],\n otherEvents: []\n });\n }\n \n const pending = pendingTextMessages.get(messageId)!;\n pending.end = endEvent;\n \n // Flush this message's events\n flushTextMessage(messageId, pending, compacted);\n pendingTextMessages.delete(messageId);\n } else if (event.type === EventType.TOOL_CALL_START) {\n const startEvent = event as ToolCallStartEvent;\n const toolCallId = startEvent.toolCallId;\n \n if (!pendingToolCalls.has(toolCallId)) {\n pendingToolCalls.set(toolCallId, {\n args: [],\n otherEvents: []\n });\n }\n \n const pending = pendingToolCalls.get(toolCallId)!;\n pending.start = startEvent;\n } else if (event.type === EventType.TOOL_CALL_ARGS) {\n const argsEvent = event as ToolCallArgsEvent;\n const toolCallId = argsEvent.toolCallId;\n \n if (!pendingToolCalls.has(toolCallId)) {\n pendingToolCalls.set(toolCallId, {\n args: [],\n otherEvents: []\n });\n }\n \n const pending = pendingToolCalls.get(toolCallId)!;\n pending.args.push(argsEvent);\n } else if (event.type === EventType.TOOL_CALL_END) {\n const endEvent = event as ToolCallEndEvent;\n const toolCallId = endEvent.toolCallId;\n \n if (!pendingToolCalls.has(toolCallId)) {\n pendingToolCalls.set(toolCallId, {\n args: [],\n otherEvents: []\n });\n }\n \n const pending = pendingToolCalls.get(toolCallId)!;\n pending.end = endEvent;\n \n // Flush this tool call's events\n flushToolCall(toolCallId, pending, compacted);\n pendingToolCalls.delete(toolCallId);\n } else {\n // For non-streaming events, check if we're in the middle of any streaming sequences\n let addedToBuffer = false;\n \n // Check text messages\n for (const [messageId, pending] of pendingTextMessages) {\n // If we have a start but no end yet, this event is \"in between\"\n if (pending.start && !pending.end) {\n pending.otherEvents.push(event);\n addedToBuffer = true;\n break;\n }\n }\n \n // Check tool calls if not already buffered\n if (!addedToBuffer) {\n for (const [toolCallId, pending] of pendingToolCalls) {\n // If we have a start but no end yet, this event is \"in between\"\n if (pending.start && !pending.end) {\n pending.otherEvents.push(event);\n addedToBuffer = true;\n break;\n }\n }\n }\n \n // If not in the middle of any streaming sequence, add directly to compacted\n if (!addedToBuffer) {\n compacted.push(event);\n }\n }\n }\n\n // Flush any remaining incomplete messages\n for (const [messageId, pending] of pendingTextMessages) {\n flushTextMessage(messageId, pending, compacted);\n }\n \n // Flush any remaining incomplete tool calls\n for (const [toolCallId, pending] of pendingToolCalls) {\n flushToolCall(toolCallId, pending, compacted);\n }\n\n return compacted;\n}\n\nfunction flushTextMessage(\n messageId: string,\n pending: {\n start?: TextMessageStartEvent;\n contents: TextMessageContentEvent[];\n end?: TextMessageEndEvent;\n otherEvents: BaseEvent[];\n },\n compacted: BaseEvent[]\n): void {\n // Add start event if present\n if (pending.start) {\n compacted.push(pending.start);\n }\n\n // Compact all content events into one\n if (pending.contents.length > 0) {\n const concatenatedDelta = pending.contents\n .map(c => c.delta)\n .join('');\n \n const compactedContent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: messageId,\n delta: concatenatedDelta,\n };\n \n compacted.push(compactedContent);\n }\n\n // Add end event if present\n if (pending.end) {\n compacted.push(pending.end);\n }\n\n // Add any events that were in between\n for (const otherEvent of pending.otherEvents) {\n compacted.push(otherEvent);\n }\n}\n\nfunction flushToolCall(\n toolCallId: string,\n pending: {\n start?: ToolCallStartEvent;\n args: ToolCallArgsEvent[];\n end?: ToolCallEndEvent;\n otherEvents: BaseEvent[];\n },\n compacted: BaseEvent[]\n): void {\n // Add start event if present\n if (pending.start) {\n compacted.push(pending.start);\n }\n\n // Compact all args events into one\n if (pending.args.length > 0) {\n const concatenatedArgs = pending.args\n .map(a => a.delta)\n .join('');\n \n const compactedArgs: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCallId,\n delta: concatenatedArgs,\n };\n \n compacted.push(compactedArgs);\n }\n\n // Add end event if present\n if (pending.end) {\n compacted.push(pending.end);\n }\n\n // Add any events that were in between\n for (const otherEvent of pending.otherEvents) {\n compacted.push(otherEvent);\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 { 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 {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"./middleware\";\nimport { handleConnectAgent } from \"./handlers/handle-connect\";\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({\n runtime,\n basePath,\n}: CopilotEndpointParams) {\n const app = new Hono<CopilotEndpointContext>();\n\n return app\n .basePath(basePath)\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(\n { err: error, url: request.url, path },\n \"Error running before request middleware\"\n );\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(\n { err: error, url: c.req.url, path },\n \"Error running after request middleware\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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(\n { err: error, url: request.url, path: c.req.path },\n \"Error running request handler\"\n );\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 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 agent = agents[agentId].clone() as AbstractAgent;\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\n/** A string beginning with http:// or https:// that points to a webhook endpoint. */\nexport type MiddlewareURL = `${\"http\" | \"https\"}://${string}`;\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 | MiddlewareURL;\nexport type AfterRequestMiddleware = AfterRequestMiddlewareFn | MiddlewareURL;\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\nfunction isMiddlewareURL(value: unknown): value is MiddlewareURL {\n return typeof value === \"string\" && /^https?:\\/\\//.test(value);\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 // Webhook middleware\n if (isMiddlewareURL(mw)) {\n const clone = request.clone();\n const url = new URL(request.url);\n const headersObj: Record<string, string> = {};\n clone.headers.forEach((v, k) => {\n headersObj[k] = v;\n });\n let bodyJson: unknown = undefined;\n try {\n bodyJson = await clone.json();\n } catch {\n /* ignore */\n }\n\n const payload = {\n method: request.method,\n path: url.pathname,\n query: url.search.startsWith(\"?\") ? url.search.slice(1) : url.search,\n headers: headersObj,\n body: bodyJson,\n };\n\n const ac = new AbortController();\n const to = setTimeout(() => ac.abort(), 2000);\n let res: Response;\n try {\n res = await fetch(mw, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"X-CopilotKit-Webhook-Stage\": WebhookStage.BeforeRequest,\n },\n body: JSON.stringify(payload),\n signal: ac.signal,\n });\n } catch {\n clearTimeout(to);\n throw new Response(undefined, { status: 502 });\n }\n clearTimeout(to);\n\n if (res.status >= 500) {\n throw new Response(undefined, { status: 502 });\n }\n if (res.status >= 400) {\n const errBody = await res.text();\n throw new Response(errBody || null, {\n status: res.status,\n headers: {\n \"content-type\": res.headers.get(\"content-type\") || \"application/json\",\n },\n });\n }\n if (res.status === 204) return;\n\n let json: unknown;\n try {\n json = await res.json();\n } catch {\n return;\n }\n\n if (json && typeof json === \"object\") {\n const { headers, body } = json as {\n headers?: Record<string, string>;\n body?: unknown;\n };\n const init: RequestInit = {\n method: request.method,\n };\n if (headers) {\n init.headers = headers;\n }\n // Only add body for non-GET/HEAD requests\n if (\n body !== undefined &&\n request.method !== \"GET\" &&\n request.method !== \"HEAD\"\n ) {\n init.body = JSON.stringify(body);\n }\n return new Request(request.url, init);\n }\n return;\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 if (isMiddlewareURL(mw)) {\n const clone = response.clone();\n const headersObj: Record<string, string> = {};\n clone.headers.forEach((v, k) => {\n headersObj[k] = v;\n });\n let body = \"\";\n try {\n body = await clone.text();\n } catch {\n /* ignore */\n }\n\n const payload = {\n status: clone.status,\n headers: headersObj,\n body,\n };\n\n const ac = new AbortController();\n const to = setTimeout(() => ac.abort(), 2000);\n let res: Response;\n try {\n res = await fetch(mw, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"X-CopilotKit-Webhook-Stage\": WebhookStage.AfterRequest,\n },\n body: JSON.stringify(payload),\n signal: ac.signal,\n });\n } finally {\n clearTimeout(to);\n }\n\n if (!res.ok) {\n throw new Error(\n `after_request webhook ${mw} responded with ${res.status}`\n );\n }\n return;\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 {\n AgentRunner,\n AgentRunnerConnectRequest,\n AgentRunnerIsRunningRequest,\n AgentRunnerRunRequest,\n type AgentRunnerStopRequest,\n} from \"./agent-runner\";\nimport { Observable, ReplaySubject } from \"rxjs\";\nimport {\n BaseEvent,\n RunAgentInput,\n Message,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n} from \"@ag-ui/client\";\nimport { compactEvents } from \"./event-compaction\";\nimport Database from \"better-sqlite3\";\n\nconst SCHEMA_VERSION = 1;\n\ninterface AgentRunRecord {\n id: number;\n thread_id: string;\n run_id: string;\n parent_run_id: string | null;\n events: BaseEvent[];\n input: RunAgentInput;\n created_at: number;\n version: number;\n}\n\nexport interface SqliteAgentRunnerOptions {\n dbPath?: string;\n}\n\n// Active connections for streaming events\n// This is the only in-memory state we need - just for active streaming\nconst ACTIVE_CONNECTIONS = new Map<string, ReplaySubject<BaseEvent>>();\n\nexport class SqliteAgentRunner extends AgentRunner {\n private db: any;\n\n constructor(options: SqliteAgentRunnerOptions = {}) {\n super();\n const dbPath = options.dbPath ?? \":memory:\";\n \n if (!Database) {\n throw new Error(\n 'better-sqlite3 is required for SqliteAgentRunner but was not found.\\n' +\n 'Please install it in your project:\\n' +\n ' npm install better-sqlite3\\n' +\n ' or\\n' +\n ' pnpm add better-sqlite3\\n' +\n ' or\\n' +\n ' yarn add better-sqlite3\\n\\n' +\n 'If you don\\'t need persistence, use InMemoryAgentRunner instead.'\n );\n }\n \n this.db = new Database(dbPath);\n this.initializeSchema();\n }\n\n private convertMessageToEvents(message: Message): BaseEvent[] {\n const events: BaseEvent[] = [];\n\n if (\n (message.role === \"assistant\" ||\n message.role === \"user\" ||\n message.role === \"developer\" ||\n message.role === \"system\") &&\n message.content\n ) {\n const textStartEvent: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: message.id,\n role: message.role,\n };\n events.push(textStartEvent);\n\n const textContentEvent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: message.id,\n delta: message.content,\n };\n events.push(textContentEvent);\n\n const textEndEvent: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: message.id,\n };\n events.push(textEndEvent);\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n const toolStartEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCall.id,\n toolCallName: toolCall.function.name,\n parentMessageId: message.id,\n };\n events.push(toolStartEvent);\n\n const toolArgsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCall.id,\n delta: toolCall.function.arguments,\n };\n events.push(toolArgsEvent);\n\n const toolEndEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n };\n events.push(toolEndEvent);\n }\n }\n\n if (message.role === \"tool\" && message.toolCallId) {\n const toolResultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n messageId: message.id,\n toolCallId: message.toolCallId,\n content: message.content,\n role: \"tool\",\n };\n events.push(toolResultEvent);\n }\n\n return events;\n }\n\n private initializeSchema(): void {\n // Create the agent_runs table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS agent_runs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n thread_id TEXT NOT NULL,\n run_id TEXT NOT NULL UNIQUE,\n parent_run_id TEXT,\n events TEXT NOT NULL,\n input TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n version INTEGER NOT NULL\n )\n `);\n\n // Create run_state table to track active runs\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS run_state (\n thread_id TEXT PRIMARY KEY,\n is_running INTEGER DEFAULT 0,\n current_run_id TEXT,\n updated_at INTEGER NOT NULL\n )\n `);\n\n // Create indexes for efficient queries\n this.db.exec(`\n CREATE INDEX IF NOT EXISTS idx_thread_id ON agent_runs(thread_id);\n CREATE INDEX IF NOT EXISTS idx_parent_run_id ON agent_runs(parent_run_id);\n `);\n\n // Create schema version table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL\n )\n `);\n\n // Check and set schema version\n const currentVersion = this.db\n .prepare(\"SELECT version FROM schema_version ORDER BY version DESC LIMIT 1\")\n .get() as { version: number } | undefined;\n\n if (!currentVersion || currentVersion.version < SCHEMA_VERSION) {\n this.db\n .prepare(\"INSERT OR REPLACE INTO schema_version (version, applied_at) VALUES (?, ?)\")\n .run(SCHEMA_VERSION, Date.now());\n }\n }\n\n private storeRun(\n threadId: string,\n runId: string,\n events: BaseEvent[],\n input: RunAgentInput,\n parentRunId?: string | null\n ): void {\n // Compact ONLY the events from this run\n const compactedEvents = compactEvents(events);\n \n const stmt = this.db.prepare(`\n INSERT INTO agent_runs (thread_id, run_id, parent_run_id, events, input, created_at, version)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n threadId,\n runId,\n parentRunId ?? null,\n JSON.stringify(compactedEvents), // Store only this run's compacted events\n JSON.stringify(input),\n Date.now(),\n SCHEMA_VERSION\n );\n }\n\n private getHistoricRuns(threadId: string): AgentRunRecord[] {\n const stmt = this.db.prepare(`\n WITH RECURSIVE run_chain AS (\n -- Base case: find the root runs (those without parent)\n SELECT * FROM agent_runs \n WHERE thread_id = ? AND parent_run_id IS NULL\n \n UNION ALL\n \n -- Recursive case: find children of current level\n SELECT ar.* FROM agent_runs ar\n INNER JOIN run_chain rc ON ar.parent_run_id = rc.run_id\n WHERE ar.thread_id = ?\n )\n SELECT * FROM run_chain\n ORDER BY created_at ASC\n `);\n\n const rows = stmt.all(threadId, threadId) as any[];\n \n return rows.map(row => ({\n id: row.id,\n thread_id: row.thread_id,\n run_id: row.run_id,\n parent_run_id: row.parent_run_id,\n events: JSON.parse(row.events),\n input: JSON.parse(row.input),\n created_at: row.created_at,\n version: row.version\n }));\n }\n\n private getLatestRunId(threadId: string): string | null {\n const stmt = this.db.prepare(`\n SELECT run_id FROM agent_runs \n WHERE thread_id = ? \n ORDER BY created_at DESC \n LIMIT 1\n `);\n\n const result = stmt.get(threadId) as { run_id: string } | undefined;\n return result?.run_id ?? null;\n }\n\n private setRunState(threadId: string, isRunning: boolean, runId?: string): void {\n const stmt = this.db.prepare(`\n INSERT OR REPLACE INTO run_state (thread_id, is_running, current_run_id, updated_at)\n VALUES (?, ?, ?, ?)\n `);\n stmt.run(threadId, isRunning ? 1 : 0, runId ?? null, Date.now());\n }\n\n private getRunState(threadId: string): { isRunning: boolean; currentRunId: string | null } {\n const stmt = this.db.prepare(`\n SELECT is_running, current_run_id FROM run_state WHERE thread_id = ?\n `);\n const result = stmt.get(threadId) as { is_running: number; current_run_id: string | null } | undefined;\n \n return {\n isRunning: result?.is_running === 1,\n currentRunId: result?.current_run_id ?? null\n };\n }\n\n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n // Check if thread is already running in database\n const runState = this.getRunState(request.threadId);\n if (runState.isRunning) {\n throw new Error(\"Thread already running\");\n }\n\n // Mark thread as running in database\n this.setRunState(request.threadId, true, request.input.runId);\n\n // Track seen message IDs and current run events in memory for this run\n const seenMessageIds = new Set<string>();\n const currentRunEvents: BaseEvent[] = [];\n \n // Get all previously seen message IDs from historic runs\n const historicRuns = this.getHistoricRuns(request.threadId);\n const historicMessageIds = new Set<string>();\n for (const run of historicRuns) {\n for (const event of run.events) {\n if ('messageId' in event && typeof event.messageId === 'string') {\n historicMessageIds.add(event.messageId);\n }\n }\n }\n\n // Get or create subject for this thread's connections\n const nextSubject = new ReplaySubject<BaseEvent>(Infinity);\n const prevSubject = ACTIVE_CONNECTIONS.get(request.threadId);\n \n // Update the active connection for this thread\n ACTIVE_CONNECTIONS.set(request.threadId, nextSubject);\n\n // Create a subject for run() return value\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\n\n // Helper function to run the agent and handle errors\n const runAgent = async () => {\n // Get parent run ID for chaining\n const parentRunId = this.getLatestRunId(request.threadId);\n \n try {\n await request.agent.runAgent(request.input, {\n onEvent: ({ event }) => {\n runSubject.next(event); // For run() return - only agent events\n nextSubject.next(event); // For connect() / store - all events\n currentRunEvents.push(event); // Accumulate for database 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 // Process input messages\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 const events = this.convertMessageToEvents(message);\n \n // Check if this message is NEW (not in historic runs)\n const isNewMessage = !historicMessageIds.has(message.id);\n \n for (const event of events) {\n // Always emit to stream for context\n nextSubject.next(event);\n \n // Store if this is a NEW message for this run\n if (isNewMessage) {\n currentRunEvents.push(event);\n }\n }\n }\n }\n }\n },\n });\n \n // Store the run in database\n this.storeRun(\n request.threadId,\n request.input.runId,\n currentRunEvents,\n request.input,\n parentRunId\n );\n \n // Mark run as complete in database\n this.setRunState(request.threadId, false);\n \n // Complete the subjects\n runSubject.complete();\n nextSubject.complete();\n } catch {\n // Store the run even if it failed (partial events)\n if (currentRunEvents.length > 0) {\n this.storeRun(\n request.threadId,\n request.input.runId,\n currentRunEvents,\n request.input,\n parentRunId\n );\n }\n \n // Mark run as complete in database\n this.setRunState(request.threadId, false);\n \n // Don't emit error to the subject, just complete it\n // This allows subscribers to get events emitted before the error\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 connectionSubject = new ReplaySubject<BaseEvent>(Infinity);\n\n // Load historic runs from database\n const historicRuns = this.getHistoricRuns(request.threadId);\n \n // Collect all historic events from database\n const allHistoricEvents: BaseEvent[] = [];\n for (const run of historicRuns) {\n allHistoricEvents.push(...run.events);\n }\n \n // Compact all events together before emitting\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 const activeSubject = ACTIVE_CONNECTIONS.get(request.threadId);\n const runState = this.getRunState(request.threadId);\n \n if (activeSubject && runState.isRunning) {\n activeSubject.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 runState = this.getRunState(request.threadId);\n return Promise.resolve(runState.isRunning);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n stop(_request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n throw new Error(\"Method not implemented.\");\n }\n\n /**\n * Close the database connection (for cleanup)\n */\n close(): void {\n if (this.db) {\n this.db.close();\n }\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 BaseEvent,\n RunAgentInput,\n Message,\n EventType,\n TextMessageStartEvent,\n TextMessageContentEvent,\n TextMessageEndEvent,\n ToolCallStartEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallResultEvent,\n} from \"@ag-ui/client\";\nimport { compactEvents } from \"./event-compaction\";\nimport { Kysely, Generated } from \"kysely\";\nimport { Redis } from \"ioredis\";\n\nconst SCHEMA_VERSION = 1;\n\ninterface AgentDatabase {\n agent_runs: {\n id: Generated<number>;\n thread_id: string;\n run_id: string;\n parent_run_id: string | null;\n events: string;\n input: string;\n created_at: number;\n version: number;\n };\n \n run_state: {\n thread_id: string;\n is_running: number;\n current_run_id: string | null;\n server_id: string | null;\n updated_at: number;\n };\n \n schema_version: {\n version: number;\n applied_at: number;\n };\n}\n\ninterface AgentRunRecord {\n id: number;\n thread_id: string;\n run_id: string;\n parent_run_id: string | null;\n events: string;\n input: string;\n created_at: number;\n version: number;\n}\n\nconst redisKeys = {\n stream: (threadId: string, runId: string) => `stream:${threadId}:${runId}`,\n active: (threadId: string) => `active:${threadId}`,\n lock: (threadId: string) => `lock:${threadId}`,\n};\n\nexport interface EnterpriseAgentRunnerOptions {\n kysely: Kysely<AgentDatabase>;\n redis: Redis;\n redisSub?: Redis;\n streamRetentionMs?: number;\n streamActiveTTLMs?: number;\n lockTTLMs?: number;\n serverId?: string;\n}\n\nexport class EnterpriseAgentRunner extends AgentRunner {\n private db: Kysely<AgentDatabase>;\n public redis: Redis;\n public redisSub: Redis;\n private serverId: string;\n private streamRetentionMs: number;\n private streamActiveTTLMs: number;\n private lockTTLMs: number;\n \n constructor(options: EnterpriseAgentRunnerOptions) {\n super();\n this.db = options.kysely;\n this.redis = options.redis;\n this.redisSub = options.redisSub || options.redis.duplicate();\n this.serverId = options.serverId || this.generateServerId();\n this.streamRetentionMs = options.streamRetentionMs ?? 3600000; // 1 hour\n this.streamActiveTTLMs = options.streamActiveTTLMs ?? 300000; // 5 minutes\n this.lockTTLMs = options.lockTTLMs ?? 300000; // 5 minutes\n \n this.initializeSchema();\n }\n \n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\n \n const executeRun = async () => {\n const { threadId, input, agent } = request;\n const runId = input.runId;\n const streamKey = redisKeys.stream(threadId, runId);\n \n // Check if thread already running (do this check synchronously for consistency with SQLite)\n // For now we'll just check after, but in production you might want a sync check\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n if (activeRunId) {\n throw new Error(\"Thread already running\");\n }\n \n // Acquire distributed lock\n const lockAcquired = await this.redis.set(\n redisKeys.lock(threadId),\n this.serverId,\n 'PX', this.lockTTLMs,\n 'NX'\n );\n \n if (!lockAcquired) {\n throw new Error(\"Thread already running\");\n }\n \n // Mark as active\n await this.redis.setex(\n redisKeys.active(threadId),\n Math.floor(this.lockTTLMs / 1000),\n runId\n );\n \n // Update database state\n await this.setRunState(threadId, true, runId);\n \n // Track events and message IDs\n const currentRunEvents: BaseEvent[] = [];\n const seenMessageIds = new Set<string>();\n \n // Get historic message IDs\n const historicRuns = await this.getHistoricRuns(threadId);\n const historicMessageIds = new Set<string>();\n for (const run of historicRuns) {\n const events = JSON.parse(run.events) as BaseEvent[];\n for (const event of events) {\n if ('messageId' in event && typeof event.messageId === 'string') {\n historicMessageIds.add(event.messageId);\n }\n }\n }\n \n const parentRunId = historicRuns[historicRuns.length - 1]?.run_id ?? null;\n \n try {\n await agent.runAgent(input, {\n onEvent: async ({ event }) => {\n // Emit to run() caller\n runSubject.next(event);\n \n // Collect for database\n currentRunEvents.push(event);\n \n // Stream to Redis for connect() subscribers\n await this.redis.xadd(\n streamKey,\n 'MAXLEN', '~', '10000',\n '*',\n 'type', event.type,\n 'data', JSON.stringify(event)\n );\n \n // Refresh TTL with sliding window during active writes\n await this.redis.pexpire(streamKey, this.streamActiveTTLMs);\n \n // Check for completion events\n if (event.type === EventType.RUN_FINISHED || \n event.type === EventType.RUN_ERROR) {\n // Switch to retention TTL for late readers\n await this.redis.pexpire(streamKey, this.streamRetentionMs);\n }\n },\n \n onNewMessage: ({ message }) => {\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n },\n \n onRunStartedEvent: async () => {\n // Process input messages\n if (input.messages) {\n for (const message of input.messages) {\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n const events = this.convertMessageToEvents(message);\n const isNewMessage = !historicMessageIds.has(message.id);\n \n for (const event of events) {\n // Stream to Redis for context\n await this.redis.xadd(\n streamKey,\n 'MAXLEN', '~', '10000',\n '*',\n 'type', event.type,\n 'data', JSON.stringify(event)\n );\n \n if (isNewMessage) {\n currentRunEvents.push(event);\n }\n }\n }\n }\n }\n \n // Refresh TTL\n await this.redis.pexpire(streamKey, this.streamActiveTTLMs);\n },\n });\n \n // Store to database\n const compactedEvents = compactEvents(currentRunEvents);\n await this.storeRun(threadId, runId, compactedEvents, input, parentRunId);\n \n } finally {\n // Clean up (even on error)\n await this.setRunState(threadId, false);\n await this.redis.del(redisKeys.active(threadId));\n await this.redis.del(redisKeys.lock(threadId));\n \n // Ensure stream has retention TTL for late readers\n const exists = await this.redis.exists(streamKey);\n if (exists) {\n await this.redis.pexpire(streamKey, this.streamRetentionMs);\n }\n \n runSubject.complete();\n }\n };\n \n executeRun().catch((error) => {\n runSubject.error(error);\n });\n \n return runSubject.asObservable();\n }\n \n connect(request: AgentRunnerConnectRequest): Observable<BaseEvent> {\n const connectionSubject = new ReplaySubject<BaseEvent>(Infinity);\n \n const streamConnection = async () => {\n const { threadId } = request;\n \n // Load and emit historic runs from database\n const historicRuns = await this.getHistoricRuns(threadId);\n const allHistoricEvents: BaseEvent[] = [];\n \n for (const run of historicRuns) {\n const events = JSON.parse(run.events) as BaseEvent[];\n allHistoricEvents.push(...events);\n }\n \n // Compact and emit historic events\n const compactedEvents = compactEvents(allHistoricEvents);\n const emittedMessageIds = new Set<string>();\n \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 // Check for active run\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n \n if (activeRunId) {\n // Tail the run-specific Redis stream\n const streamKey = redisKeys.stream(threadId, activeRunId);\n let lastId = '0-0';\n let consecutiveEmptyReads = 0;\n \n while (true) {\n try {\n // Read with blocking using call method for better compatibility\n const result = await this.redis.call(\n 'XREAD',\n 'BLOCK', '5000',\n 'COUNT', '100',\n 'STREAMS', streamKey, lastId\n ) as [string, [string, string[]][]][] | null;\n \n if (!result || result.length === 0) {\n consecutiveEmptyReads++;\n \n // Check if stream still exists\n const exists = await this.redis.exists(streamKey);\n if (!exists) {\n // Stream expired, we're done\n break;\n }\n \n // Check if thread still active\n const stillActive = await this.redis.get(redisKeys.active(threadId));\n if (stillActive !== activeRunId) {\n // Different run started or thread stopped\n break;\n }\n \n // After multiple empty reads, assume completion\n if (consecutiveEmptyReads > 3) {\n break;\n }\n \n continue;\n }\n \n consecutiveEmptyReads = 0;\n const [, messages] = result[0] || [null, []];\n \n for (const [id, fields] of messages || []) {\n lastId = id;\n \n // Extract event data (fields is array: [key, value, key, value, ...])\n let eventData: string | null = null;\n let eventType: string | null = null;\n \n for (let i = 0; i < fields.length; i += 2) {\n if (fields[i] === 'data') {\n eventData = fields[i + 1] ?? null;\n } else if (fields[i] === 'type') {\n eventType = fields[i + 1] ?? null;\n }\n }\n \n if (eventData) {\n const event = JSON.parse(eventData) as BaseEvent;\n \n // Skip already emitted messages\n if ('messageId' in event && \n typeof event.messageId === 'string' && \n emittedMessageIds.has(event.messageId)) {\n continue;\n }\n \n connectionSubject.next(event);\n \n // Check for completion events\n if (eventType === EventType.RUN_FINISHED || \n eventType === EventType.RUN_ERROR) {\n connectionSubject.complete();\n return;\n }\n }\n }\n } catch {\n // Redis error, complete the stream\n break;\n }\n }\n }\n \n connectionSubject.complete();\n };\n \n streamConnection().catch(() => connectionSubject.complete());\n return connectionSubject.asObservable();\n }\n \n async isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean> {\n const { threadId } = request;\n \n // Check Redis first for speed\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n if (activeRunId) return true;\n \n // Check lock\n const lockExists = await this.redis.exists(redisKeys.lock(threadId));\n if (lockExists) return true;\n \n // Fallback to database\n const state = await this.db\n .selectFrom('run_state')\n .where('thread_id', '=', threadId)\n .selectAll()\n .executeTakeFirst();\n \n return state?.is_running === 1;\n }\n \n async stop(request: AgentRunnerStopRequest): Promise<boolean> {\n const { threadId } = request;\n \n // Get active run ID\n const activeRunId = await this.redis.get(redisKeys.active(threadId));\n if (!activeRunId) {\n return false;\n }\n \n // Add RUN_ERROR event to stream\n const streamKey = redisKeys.stream(threadId, activeRunId);\n await this.redis.xadd(\n streamKey,\n '*',\n 'type', EventType.RUN_ERROR,\n 'data', JSON.stringify({\n type: EventType.RUN_ERROR,\n error: 'Run stopped by user'\n })\n );\n \n // Set retention TTL\n await this.redis.pexpire(streamKey, this.streamRetentionMs);\n \n // Clean up\n await this.setRunState(threadId, false);\n await this.redis.del(redisKeys.active(threadId));\n await this.redis.del(redisKeys.lock(threadId));\n \n return true;\n }\n \n // Helper methods\n private convertMessageToEvents(message: Message): BaseEvent[] {\n const events: BaseEvent[] = [];\n\n if (\n (message.role === \"assistant\" ||\n message.role === \"user\" ||\n message.role === \"developer\" ||\n message.role === \"system\") &&\n message.content\n ) {\n const textStartEvent: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: message.id,\n role: message.role,\n };\n events.push(textStartEvent);\n\n const textContentEvent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: message.id,\n delta: message.content,\n };\n events.push(textContentEvent);\n\n const textEndEvent: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: message.id,\n };\n events.push(textEndEvent);\n }\n\n if (message.role === \"assistant\" && message.toolCalls) {\n for (const toolCall of message.toolCalls) {\n const toolStartEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: toolCall.id,\n toolCallName: toolCall.function.name,\n parentMessageId: message.id,\n };\n events.push(toolStartEvent);\n\n const toolArgsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCall.id,\n delta: toolCall.function.arguments,\n };\n events.push(toolArgsEvent);\n\n const toolEndEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n };\n events.push(toolEndEvent);\n }\n }\n\n if (message.role === \"tool\" && message.toolCallId) {\n const toolResultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n messageId: message.id,\n toolCallId: message.toolCallId,\n content: message.content,\n role: \"tool\",\n };\n events.push(toolResultEvent);\n }\n\n return events;\n }\n \n private async initializeSchema(): Promise<void> {\n try {\n // Create agent_runs table\n await this.db.schema\n .createTable('agent_runs')\n .ifNotExists()\n .addColumn('id', 'integer', (col) => col.primaryKey().autoIncrement())\n .addColumn('thread_id', 'text', (col) => col.notNull())\n .addColumn('run_id', 'text', (col) => col.notNull().unique())\n .addColumn('parent_run_id', 'text')\n .addColumn('events', 'text', (col) => col.notNull())\n .addColumn('input', 'text', (col) => col.notNull())\n .addColumn('created_at', 'integer', (col) => col.notNull())\n .addColumn('version', 'integer', (col) => col.notNull())\n .execute()\n .catch(() => {}); // Ignore if already exists\n \n // Create run_state table\n await this.db.schema\n .createTable('run_state')\n .ifNotExists()\n .addColumn('thread_id', 'text', (col) => col.primaryKey())\n .addColumn('is_running', 'integer', (col) => col.defaultTo(0))\n .addColumn('current_run_id', 'text')\n .addColumn('server_id', 'text')\n .addColumn('updated_at', 'integer', (col) => col.notNull())\n .execute()\n .catch(() => {}); // Ignore if already exists\n \n // Create schema_version table\n await this.db.schema\n .createTable('schema_version')\n .ifNotExists()\n .addColumn('version', 'integer', (col) => col.primaryKey())\n .addColumn('applied_at', 'integer', (col) => col.notNull())\n .execute()\n .catch(() => {}); // Ignore if already exists\n \n // Create indexes\n await this.db.schema\n .createIndex('idx_thread_id')\n .ifNotExists()\n .on('agent_runs')\n .column('thread_id')\n .execute()\n .catch(() => {});\n \n await this.db.schema\n .createIndex('idx_parent_run_id')\n .ifNotExists()\n .on('agent_runs')\n .column('parent_run_id')\n .execute()\n .catch(() => {});\n \n // Check and set schema version\n const currentVersion = await this.db\n .selectFrom('schema_version')\n .orderBy('version', 'desc')\n .limit(1)\n .selectAll()\n .executeTakeFirst();\n \n if (!currentVersion || currentVersion.version < SCHEMA_VERSION) {\n await this.db\n .insertInto('schema_version')\n .values({\n version: SCHEMA_VERSION,\n applied_at: Date.now()\n })\n .onConflict((oc) => oc\n .column('version')\n .doUpdateSet({ applied_at: Date.now() })\n )\n .execute();\n }\n } catch {\n // Schema initialization might fail if DB is closed, ignore\n }\n }\n \n private async storeRun(\n threadId: string,\n runId: string,\n events: BaseEvent[],\n input: RunAgentInput,\n parentRunId: string | null\n ): Promise<void> {\n await this.db.insertInto('agent_runs')\n .values({\n thread_id: threadId,\n run_id: runId,\n parent_run_id: parentRunId,\n events: JSON.stringify(events),\n input: JSON.stringify(input),\n created_at: Date.now(),\n version: SCHEMA_VERSION\n })\n .execute();\n }\n \n private async getHistoricRuns(threadId: string): Promise<AgentRunRecord[]> {\n const rows = await this.db\n .selectFrom('agent_runs')\n .where('thread_id', '=', threadId)\n .orderBy('created_at', 'asc')\n .selectAll()\n .execute();\n \n return rows.map(row => ({\n id: Number(row.id),\n thread_id: row.thread_id,\n run_id: row.run_id,\n parent_run_id: row.parent_run_id,\n events: row.events,\n input: row.input,\n created_at: row.created_at,\n version: row.version\n }));\n }\n \n private async setRunState(\n threadId: string,\n isRunning: boolean,\n runId?: string\n ): Promise<void> {\n await this.db.insertInto('run_state')\n .values({\n thread_id: threadId,\n is_running: isRunning ? 1 : 0,\n current_run_id: runId ?? null,\n server_id: this.serverId,\n updated_at: Date.now()\n })\n .onConflict((oc) => oc\n .column('thread_id')\n .doUpdateSet({\n is_running: isRunning ? 1 : 0,\n current_run_id: runId ?? null,\n server_id: this.serverId,\n updated_at: Date.now()\n })\n )\n .execute();\n }\n \n async close(): Promise<void> {\n await this.db.destroy();\n this.redis.disconnect();\n this.redisSub.disconnect();\n }\n \n private generateServerId(): string {\n return `server-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n}"],"mappings":"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","names":["EventType","EventType","logger","RunAgentInputSchema","EventEncoder","logger","ReplaySubject","EventType","EventType","ReplaySubject","ReplaySubject","EventType","SCHEMA_VERSION","ReplaySubject","EventType"]}
|