@copilotkitnext/runtime 1.51.4 → 1.51.5-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +29 -0
  2. package/dist/endpoints/express-single.cjs +187 -0
  3. package/dist/endpoints/express-single.cjs.map +1 -0
  4. package/dist/endpoints/express-single.d.cts +15 -0
  5. package/dist/endpoints/express-single.d.cts.map +1 -0
  6. package/dist/endpoints/express-single.d.mts +15 -0
  7. package/dist/endpoints/express-single.d.mts.map +1 -0
  8. package/dist/endpoints/express-single.mjs +184 -0
  9. package/dist/endpoints/express-single.mjs.map +1 -0
  10. package/dist/endpoints/express-utils.cjs +118 -0
  11. package/dist/endpoints/express-utils.cjs.map +1 -0
  12. package/dist/endpoints/express-utils.mjs +116 -0
  13. package/dist/endpoints/express-utils.mjs.map +1 -0
  14. package/dist/endpoints/express.cjs +165 -0
  15. package/dist/endpoints/express.cjs.map +1 -0
  16. package/dist/endpoints/express.d.cts +15 -0
  17. package/dist/endpoints/express.d.cts.map +1 -0
  18. package/dist/endpoints/express.d.mts +15 -0
  19. package/dist/endpoints/express.d.mts.map +1 -0
  20. package/dist/endpoints/express.mjs +162 -0
  21. package/dist/endpoints/express.mjs.map +1 -0
  22. package/dist/endpoints/hono-single.cjs +140 -0
  23. package/dist/endpoints/hono-single.cjs.map +1 -0
  24. package/dist/endpoints/hono-single.d.cts +31 -0
  25. package/dist/endpoints/hono-single.d.cts.map +1 -0
  26. package/dist/endpoints/hono-single.d.mts +31 -0
  27. package/dist/endpoints/hono-single.d.mts.map +1 -0
  28. package/dist/endpoints/hono-single.mjs +139 -0
  29. package/dist/endpoints/hono-single.mjs.map +1 -0
  30. package/dist/endpoints/hono.cjs +152 -0
  31. package/dist/endpoints/hono.cjs.map +1 -0
  32. package/dist/endpoints/hono.d.cts +47 -0
  33. package/dist/endpoints/hono.d.cts.map +1 -0
  34. package/dist/endpoints/hono.d.mts +47 -0
  35. package/dist/endpoints/hono.d.mts.map +1 -0
  36. package/dist/endpoints/hono.mjs +151 -0
  37. package/dist/endpoints/hono.mjs.map +1 -0
  38. package/dist/endpoints/index.cjs +2 -0
  39. package/dist/endpoints/index.d.mts +2 -0
  40. package/dist/endpoints/index.mjs +4 -0
  41. package/dist/endpoints/single-route-helpers.cjs +67 -0
  42. package/dist/endpoints/single-route-helpers.cjs.map +1 -0
  43. package/dist/endpoints/single-route-helpers.mjs +64 -0
  44. package/dist/endpoints/single-route-helpers.mjs.map +1 -0
  45. package/dist/express.cjs +6 -0
  46. package/dist/express.d.cts +3 -0
  47. package/dist/express.d.mts +3 -19
  48. package/dist/express.mjs +3 -477
  49. package/dist/handlers/get-runtime-info.cjs +36 -0
  50. package/dist/handlers/get-runtime-info.cjs.map +1 -0
  51. package/dist/handlers/get-runtime-info.mjs +36 -0
  52. package/dist/handlers/get-runtime-info.mjs.map +1 -0
  53. package/dist/handlers/handle-connect.cjs +102 -0
  54. package/dist/handlers/handle-connect.cjs.map +1 -0
  55. package/dist/handlers/handle-connect.mjs +101 -0
  56. package/dist/handlers/handle-connect.mjs.map +1 -0
  57. package/dist/handlers/handle-run.cjs +114 -0
  58. package/dist/handlers/handle-run.cjs.map +1 -0
  59. package/dist/handlers/handle-run.mjs +113 -0
  60. package/dist/handlers/handle-run.mjs.map +1 -0
  61. package/dist/handlers/handle-stop.cjs +46 -0
  62. package/dist/handlers/handle-stop.cjs.map +1 -0
  63. package/dist/handlers/handle-stop.mjs +45 -0
  64. package/dist/handlers/handle-stop.mjs.map +1 -0
  65. package/dist/handlers/handle-transcribe.cjs +111 -0
  66. package/dist/handlers/handle-transcribe.cjs.map +1 -0
  67. package/dist/handlers/handle-transcribe.mjs +110 -0
  68. package/dist/handlers/handle-transcribe.mjs.map +1 -0
  69. package/dist/handlers/header-utils.cjs +25 -0
  70. package/dist/handlers/header-utils.cjs.map +1 -0
  71. package/dist/handlers/header-utils.mjs +24 -0
  72. package/dist/handlers/header-utils.mjs.map +1 -0
  73. package/dist/index.cjs +25 -0
  74. package/dist/index.d.cts +8 -0
  75. package/dist/index.d.mts +9 -139
  76. package/dist/index.mjs +10 -335
  77. package/dist/middleware.cjs +29 -0
  78. package/dist/middleware.cjs.map +1 -0
  79. package/dist/middleware.d.cts +24 -0
  80. package/dist/middleware.d.cts.map +1 -0
  81. package/dist/middleware.d.mts +24 -0
  82. package/dist/middleware.d.mts.map +1 -0
  83. package/dist/middleware.mjs +27 -0
  84. package/dist/middleware.mjs.map +1 -0
  85. package/dist/package.cjs +12 -0
  86. package/dist/package.cjs.map +1 -0
  87. package/dist/package.mjs +6 -0
  88. package/dist/package.mjs.map +1 -0
  89. package/dist/runner/agent-runner.cjs +7 -0
  90. package/dist/runner/agent-runner.cjs.map +1 -0
  91. package/dist/runner/agent-runner.d.cts +28 -0
  92. package/dist/runner/agent-runner.d.cts.map +1 -0
  93. package/dist/runner/agent-runner.d.mts +28 -0
  94. package/dist/runner/agent-runner.d.mts.map +1 -0
  95. package/dist/runner/agent-runner.mjs +6 -0
  96. package/dist/runner/agent-runner.mjs.map +1 -0
  97. package/dist/runner/in-memory.cjs +230 -0
  98. package/dist/runner/in-memory.cjs.map +1 -0
  99. package/dist/runner/in-memory.d.cts +14 -0
  100. package/dist/runner/in-memory.d.cts.map +1 -0
  101. package/dist/runner/in-memory.d.mts +14 -0
  102. package/dist/runner/in-memory.d.mts.map +1 -0
  103. package/dist/runner/in-memory.mjs +229 -0
  104. package/dist/runner/in-memory.mjs.map +1 -0
  105. package/dist/runner/index.cjs +4 -0
  106. package/dist/runner/index.d.cts +4 -0
  107. package/dist/runner/index.d.mts +4 -0
  108. package/dist/runner/index.mjs +5 -0
  109. package/dist/runtime.cjs +27 -0
  110. package/dist/runtime.cjs.map +1 -0
  111. package/dist/runtime.d.cts +43 -0
  112. package/dist/runtime.d.cts.map +1 -0
  113. package/dist/runtime.d.mts +43 -0
  114. package/dist/runtime.d.mts.map +1 -0
  115. package/dist/runtime.mjs +26 -0
  116. package/dist/runtime.mjs.map +1 -0
  117. package/dist/transcription-service/transcription-service.cjs +7 -0
  118. package/dist/transcription-service/transcription-service.cjs.map +1 -0
  119. package/dist/transcription-service/transcription-service.d.cts +14 -0
  120. package/dist/transcription-service/transcription-service.d.cts.map +1 -0
  121. package/dist/transcription-service/transcription-service.d.mts +14 -0
  122. package/dist/transcription-service/transcription-service.d.mts.map +1 -0
  123. package/dist/transcription-service/transcription-service.mjs +6 -0
  124. package/dist/transcription-service/transcription-service.mjs.map +1 -0
  125. package/package.json +25 -22
  126. package/tsdown.config.ts +16 -0
  127. package/dist/chunk-5GKH3W25.mjs +0 -1054
  128. package/dist/chunk-5GKH3W25.mjs.map +0 -1
  129. package/dist/express.d.ts +0 -19
  130. package/dist/express.js +0 -1292
  131. package/dist/express.js.map +0 -1
  132. package/dist/express.mjs.map +0 -1
  133. package/dist/index.d.ts +0 -139
  134. package/dist/index.js +0 -1387
  135. package/dist/index.js.map +0 -1
  136. package/dist/index.mjs.map +0 -1
  137. package/dist/runtime-BsuyYT2l.d.mts +0 -98
  138. package/dist/runtime-BsuyYT2l.d.ts +0 -98
@@ -0,0 +1,230 @@
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ const require_agent_runner = require('./agent-runner.cjs');
3
+ let rxjs = require("rxjs");
4
+ let _ag_ui_client = require("@ag-ui/client");
5
+ let _copilotkitnext_shared = require("@copilotkitnext/shared");
6
+
7
+ //#region src/runner/in-memory.ts
8
+ var InMemoryEventStore = class {
9
+ constructor(threadId) {
10
+ this.threadId = threadId;
11
+ }
12
+ /** The subject that current consumers subscribe to. */
13
+ subject = null;
14
+ /** True while a run is actively producing events. */
15
+ isRunning = false;
16
+ /** Current run ID */
17
+ currentRunId = null;
18
+ /** Historic completed runs */
19
+ historicRuns = [];
20
+ /** Currently running agent instance (if any). */
21
+ agent = null;
22
+ /** Subject returned from run() while the run is active. */
23
+ runSubject = null;
24
+ /** True once stop() has been requested but the run has not yet finalized. */
25
+ stopRequested = false;
26
+ /** Reference to the events emitted in the current run. */
27
+ currentEvents = null;
28
+ };
29
+ const GLOBAL_STORE_KEY = Symbol.for("@copilotkitnext/runtime/in-memory-store");
30
+ function getGlobalStore() {
31
+ const globalAny = globalThis;
32
+ if (!globalAny[GLOBAL_STORE_KEY]) globalAny[GLOBAL_STORE_KEY] = {
33
+ stores: /* @__PURE__ */ new Map(),
34
+ historicRunsBackup: /* @__PURE__ */ new Map()
35
+ };
36
+ const data = globalAny[GLOBAL_STORE_KEY];
37
+ if (data.stores.size === 0 && data.historicRunsBackup.size > 0) for (const [threadId, historicRuns] of data.historicRunsBackup) {
38
+ const store = new InMemoryEventStore(threadId);
39
+ store.historicRuns = historicRuns;
40
+ data.stores.set(threadId, store);
41
+ }
42
+ return data.stores;
43
+ }
44
+ function backupHistoricRuns(threadId, historicRuns) {
45
+ const globalAny = globalThis;
46
+ if (globalAny[GLOBAL_STORE_KEY]) globalAny[GLOBAL_STORE_KEY].historicRunsBackup.set(threadId, historicRuns);
47
+ }
48
+ const GLOBAL_STORE = getGlobalStore();
49
+ var InMemoryAgentRunner = class extends require_agent_runner.AgentRunner {
50
+ run(request) {
51
+ let existingStore = GLOBAL_STORE.get(request.threadId);
52
+ if (!existingStore) {
53
+ existingStore = new InMemoryEventStore(request.threadId);
54
+ GLOBAL_STORE.set(request.threadId, existingStore);
55
+ }
56
+ const store = existingStore;
57
+ if (store.isRunning) throw new Error("Thread already running");
58
+ store.isRunning = true;
59
+ store.currentRunId = request.input.runId;
60
+ store.agent = request.agent;
61
+ store.stopRequested = false;
62
+ const seenMessageIds = /* @__PURE__ */ new Set();
63
+ const currentRunEvents = [];
64
+ store.currentEvents = currentRunEvents;
65
+ const historicMessageIds = /* @__PURE__ */ new Set();
66
+ for (const run of store.historicRuns) for (const event of run.events) {
67
+ if ("messageId" in event && typeof event.messageId === "string") historicMessageIds.add(event.messageId);
68
+ if (event.type === _ag_ui_client.EventType.RUN_STARTED) {
69
+ const messages = event.input?.messages ?? [];
70
+ for (const message of messages) historicMessageIds.add(message.id);
71
+ }
72
+ }
73
+ const nextSubject = new rxjs.ReplaySubject(Infinity);
74
+ const prevSubject = store.subject;
75
+ store.subject = nextSubject;
76
+ const runSubject = new rxjs.ReplaySubject(Infinity);
77
+ store.runSubject = runSubject;
78
+ const runAgent = async () => {
79
+ const parentRunId = store.historicRuns[store.historicRuns.length - 1]?.runId ?? null;
80
+ try {
81
+ await request.agent.runAgent(request.input, {
82
+ onEvent: ({ event }) => {
83
+ let processedEvent = event;
84
+ if (event.type === _ag_ui_client.EventType.RUN_STARTED) {
85
+ const runStartedEvent = event;
86
+ if (!runStartedEvent.input) {
87
+ const sanitizedMessages = request.input.messages ? request.input.messages.filter((message) => !historicMessageIds.has(message.id)) : void 0;
88
+ const updatedInput = {
89
+ ...request.input,
90
+ ...sanitizedMessages !== void 0 ? { messages: sanitizedMessages } : {}
91
+ };
92
+ processedEvent = {
93
+ ...runStartedEvent,
94
+ input: updatedInput
95
+ };
96
+ }
97
+ }
98
+ runSubject.next(processedEvent);
99
+ nextSubject.next(processedEvent);
100
+ currentRunEvents.push(processedEvent);
101
+ },
102
+ onNewMessage: ({ message }) => {
103
+ if (!seenMessageIds.has(message.id)) seenMessageIds.add(message.id);
104
+ },
105
+ onRunStartedEvent: () => {
106
+ if (request.input.messages) {
107
+ for (const message of request.input.messages) if (!seenMessageIds.has(message.id)) seenMessageIds.add(message.id);
108
+ }
109
+ }
110
+ });
111
+ const appendedEvents = (0, _copilotkitnext_shared.finalizeRunEvents)(currentRunEvents, { stopRequested: store.stopRequested });
112
+ for (const event of appendedEvents) {
113
+ runSubject.next(event);
114
+ nextSubject.next(event);
115
+ }
116
+ if (store.currentRunId) {
117
+ const compactedEvents = (0, _ag_ui_client.compactEvents)(currentRunEvents);
118
+ store.historicRuns.push({
119
+ threadId: request.threadId,
120
+ runId: store.currentRunId,
121
+ parentRunId,
122
+ events: compactedEvents,
123
+ createdAt: Date.now()
124
+ });
125
+ backupHistoricRuns(request.threadId, store.historicRuns);
126
+ }
127
+ store.currentEvents = null;
128
+ store.currentRunId = null;
129
+ store.agent = null;
130
+ store.runSubject = null;
131
+ store.stopRequested = false;
132
+ store.isRunning = false;
133
+ runSubject.complete();
134
+ nextSubject.complete();
135
+ } catch (error) {
136
+ const interruptionMessage = error instanceof Error ? error.message : String(error);
137
+ const appendedEvents = (0, _copilotkitnext_shared.finalizeRunEvents)(currentRunEvents, {
138
+ stopRequested: store.stopRequested,
139
+ interruptionMessage
140
+ });
141
+ for (const event of appendedEvents) {
142
+ runSubject.next(event);
143
+ nextSubject.next(event);
144
+ }
145
+ if (store.currentRunId && currentRunEvents.length > 0) {
146
+ const compactedEvents = (0, _ag_ui_client.compactEvents)(currentRunEvents);
147
+ store.historicRuns.push({
148
+ threadId: request.threadId,
149
+ runId: store.currentRunId,
150
+ parentRunId,
151
+ events: compactedEvents,
152
+ createdAt: Date.now()
153
+ });
154
+ backupHistoricRuns(request.threadId, store.historicRuns);
155
+ }
156
+ store.currentEvents = null;
157
+ store.currentRunId = null;
158
+ store.agent = null;
159
+ store.runSubject = null;
160
+ store.stopRequested = false;
161
+ store.isRunning = false;
162
+ runSubject.complete();
163
+ nextSubject.complete();
164
+ }
165
+ };
166
+ if (prevSubject) prevSubject.subscribe({
167
+ next: (e) => nextSubject.next(e),
168
+ error: (err) => nextSubject.error(err),
169
+ complete: () => {}
170
+ });
171
+ runAgent();
172
+ return runSubject.asObservable();
173
+ }
174
+ connect(request) {
175
+ const store = GLOBAL_STORE.get(request.threadId);
176
+ const connectionSubject = new rxjs.ReplaySubject(Infinity);
177
+ if (!store) {
178
+ connectionSubject.complete();
179
+ return connectionSubject.asObservable();
180
+ }
181
+ const allHistoricEvents = [];
182
+ for (const run of store.historicRuns) allHistoricEvents.push(...run.events);
183
+ const compactedEvents = (0, _ag_ui_client.compactEvents)(allHistoricEvents);
184
+ const emittedMessageIds = /* @__PURE__ */ new Set();
185
+ for (const event of compactedEvents) {
186
+ connectionSubject.next(event);
187
+ if ("messageId" in event && typeof event.messageId === "string") emittedMessageIds.add(event.messageId);
188
+ }
189
+ if (store.subject && (store.isRunning || store.stopRequested)) store.subject.subscribe({
190
+ next: (event) => {
191
+ if ("messageId" in event && typeof event.messageId === "string" && emittedMessageIds.has(event.messageId)) return;
192
+ connectionSubject.next(event);
193
+ },
194
+ complete: () => connectionSubject.complete(),
195
+ error: (err) => connectionSubject.error(err)
196
+ });
197
+ else connectionSubject.complete();
198
+ return connectionSubject.asObservable();
199
+ }
200
+ isRunning(request) {
201
+ const store = GLOBAL_STORE.get(request.threadId);
202
+ return Promise.resolve(store?.isRunning ?? false);
203
+ }
204
+ stop(request) {
205
+ const store = GLOBAL_STORE.get(request.threadId);
206
+ if (!store || !store.isRunning) return Promise.resolve(false);
207
+ if (store.stopRequested) return Promise.resolve(false);
208
+ store.stopRequested = true;
209
+ store.isRunning = false;
210
+ const agent = store.agent;
211
+ if (!agent) {
212
+ store.stopRequested = false;
213
+ store.isRunning = false;
214
+ return Promise.resolve(false);
215
+ }
216
+ try {
217
+ agent.abortRun();
218
+ return Promise.resolve(true);
219
+ } catch (error) {
220
+ console.error("Failed to abort agent run", error);
221
+ store.stopRequested = false;
222
+ store.isRunning = true;
223
+ return Promise.resolve(false);
224
+ }
225
+ }
226
+ };
227
+
228
+ //#endregion
229
+ exports.InMemoryAgentRunner = InMemoryAgentRunner;
230
+ //# sourceMappingURL=in-memory.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.cjs","names":["AgentRunner","EventType","ReplaySubject"],"sources":["../../src/runner/in-memory.ts"],"sourcesContent":["import {\n AgentRunner,\n AgentRunnerConnectRequest,\n AgentRunnerIsRunningRequest,\n AgentRunnerRunRequest,\n type AgentRunnerStopRequest,\n} from \"./agent-runner\";\nimport { Observable, ReplaySubject } from \"rxjs\";\nimport {\n AbstractAgent,\n BaseEvent,\n EventType,\n MessagesSnapshotEvent,\n RunStartedEvent,\n compactEvents,\n} from \"@ag-ui/client\";\nimport { finalizeRunEvents } from \"@copilotkitnext/shared\";\n\ninterface HistoricRun {\n threadId: string;\n runId: string;\n parentRunId: string | null;\n events: BaseEvent[];\n createdAt: number;\n}\n\nclass InMemoryEventStore {\n constructor(public threadId: string) {}\n\n /** The subject that current consumers subscribe to. */\n subject: ReplaySubject<BaseEvent> | null = null;\n\n /** True while a run is actively producing events. */\n isRunning = false;\n\n /** Current run ID */\n currentRunId: string | null = null;\n\n /** Historic completed runs */\n historicRuns: HistoricRun[] = [];\n\n /** Currently running agent instance (if any). */\n agent: AbstractAgent | null = null;\n\n /** Subject returned from run() while the run is active. */\n runSubject: ReplaySubject<BaseEvent> | null = null;\n\n /** True once stop() has been requested but the run has not yet finalized. */\n stopRequested = false;\n\n /** Reference to the events emitted in the current run. */\n currentEvents: BaseEvent[] | null = null;\n}\n\n// Use a symbol key on globalThis to survive hot reloads in development\nconst GLOBAL_STORE_KEY = Symbol.for(\"@copilotkitnext/runtime/in-memory-store\");\n\ninterface GlobalStoreData {\n stores: Map<string, InMemoryEventStore>;\n historicRunsBackup: Map<string, HistoricRun[]>;\n}\n\nfunction getGlobalStore(): Map<string, InMemoryEventStore> {\n const globalAny = globalThis as unknown as Record<symbol, GlobalStoreData>;\n\n if (!globalAny[GLOBAL_STORE_KEY]) {\n globalAny[GLOBAL_STORE_KEY] = {\n stores: new Map<string, InMemoryEventStore>(),\n historicRunsBackup: new Map<string, HistoricRun[]>(),\n };\n }\n\n const data = globalAny[GLOBAL_STORE_KEY];\n\n // Restore historic runs from backup after hot reload\n // (when stores map is empty but backup has data)\n if (data.stores.size === 0 && data.historicRunsBackup.size > 0) {\n for (const [threadId, historicRuns] of data.historicRunsBackup) {\n const store = new InMemoryEventStore(threadId);\n store.historicRuns = historicRuns;\n data.stores.set(threadId, store);\n }\n }\n\n return data.stores;\n}\n\nfunction backupHistoricRuns(\n threadId: string,\n historicRuns: HistoricRun[],\n): void {\n const globalAny = globalThis as unknown as Record<symbol, GlobalStoreData>;\n if (globalAny[GLOBAL_STORE_KEY]) {\n globalAny[GLOBAL_STORE_KEY].historicRunsBackup.set(threadId, historicRuns);\n }\n}\n\nconst GLOBAL_STORE = getGlobalStore();\n\nexport class InMemoryAgentRunner extends AgentRunner {\n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n let existingStore = GLOBAL_STORE.get(request.threadId);\n if (!existingStore) {\n existingStore = new InMemoryEventStore(request.threadId);\n GLOBAL_STORE.set(request.threadId, existingStore);\n }\n const store = existingStore; // Now store is const and non-null\n\n if (store.isRunning) {\n throw new Error(\"Thread already running\");\n }\n store.isRunning = true;\n store.currentRunId = request.input.runId;\n store.agent = request.agent;\n store.stopRequested = false;\n\n // Track seen message IDs and current run events for this run\n const seenMessageIds = new Set<string>();\n const currentRunEvents: BaseEvent[] = [];\n store.currentEvents = currentRunEvents;\n\n // Get all previously seen message IDs from historic runs\n const historicMessageIds = new Set<string>();\n for (const run of store.historicRuns) {\n for (const event of run.events) {\n if (\"messageId\" in event && typeof event.messageId === \"string\") {\n historicMessageIds.add(event.messageId);\n }\n if (event.type === EventType.RUN_STARTED) {\n const runStarted = event as RunStartedEvent;\n const messages = runStarted.input?.messages ?? [];\n for (const message of messages) {\n historicMessageIds.add(message.id);\n }\n }\n }\n }\n\n const nextSubject = new ReplaySubject<BaseEvent>(Infinity);\n const prevSubject = store.subject;\n\n // Update the store's subject immediately\n store.subject = nextSubject;\n\n // Create a subject for run() return value\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\n store.runSubject = runSubject;\n\n // Helper function to run the agent and handle errors\n const runAgent = async () => {\n // Get parent run ID for chaining\n const lastRun = store.historicRuns[store.historicRuns.length - 1];\n const parentRunId = lastRun?.runId ?? null;\n\n try {\n await request.agent.runAgent(request.input, {\n onEvent: ({ event }) => {\n let processedEvent: BaseEvent = event;\n if (event.type === EventType.RUN_STARTED) {\n const runStartedEvent = event as RunStartedEvent;\n if (!runStartedEvent.input) {\n const sanitizedMessages = request.input.messages\n ? request.input.messages.filter(\n (message) => !historicMessageIds.has(message.id),\n )\n : undefined;\n const updatedInput = {\n ...request.input,\n ...(sanitizedMessages !== undefined\n ? { messages: sanitizedMessages }\n : {}),\n };\n processedEvent = {\n ...runStartedEvent,\n input: updatedInput,\n } as RunStartedEvent;\n }\n }\n\n runSubject.next(processedEvent); // For run() return - only agent events\n nextSubject.next(processedEvent); // For connect() / store - all events\n currentRunEvents.push(processedEvent); // Accumulate for storage\n },\n onNewMessage: ({ message }) => {\n // Called for each new message\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n },\n onRunStartedEvent: () => {\n // Mark any messages from the input as seen so they aren't emitted twice\n if (request.input.messages) {\n for (const message of request.input.messages) {\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n }\n }\n },\n });\n\n const appendedEvents = finalizeRunEvents(currentRunEvents, {\n stopRequested: store.stopRequested,\n });\n for (const event of appendedEvents) {\n runSubject.next(event);\n nextSubject.next(event);\n }\n\n // Store the completed run in memory with ONLY its events\n if (store.currentRunId) {\n // Compact the events before storing (like SQLite does)\n const compactedEvents = compactEvents(currentRunEvents);\n\n store.historicRuns.push({\n threadId: request.threadId,\n runId: store.currentRunId,\n parentRunId,\n events: compactedEvents,\n createdAt: Date.now(),\n });\n\n // Backup for hot reload survival\n backupHistoricRuns(request.threadId, store.historicRuns);\n }\n\n // Complete the run\n store.currentEvents = null;\n store.currentRunId = null;\n store.agent = null;\n store.runSubject = null;\n store.stopRequested = false;\n store.isRunning = false;\n runSubject.complete();\n nextSubject.complete();\n } catch (error) {\n const interruptionMessage =\n error instanceof Error ? error.message : String(error);\n const appendedEvents = finalizeRunEvents(currentRunEvents, {\n stopRequested: store.stopRequested,\n interruptionMessage,\n });\n for (const event of appendedEvents) {\n runSubject.next(event);\n nextSubject.next(event);\n }\n\n // Store the run even if it failed (partial events)\n if (store.currentRunId && currentRunEvents.length > 0) {\n // Compact the events before storing (like SQLite does)\n const compactedEvents = compactEvents(currentRunEvents);\n store.historicRuns.push({\n threadId: request.threadId,\n runId: store.currentRunId,\n parentRunId,\n events: compactedEvents,\n createdAt: Date.now(),\n });\n\n // Backup for hot reload survival\n backupHistoricRuns(request.threadId, store.historicRuns);\n }\n\n // Complete the run\n store.currentEvents = null;\n store.currentRunId = null;\n store.agent = null;\n store.runSubject = null;\n store.stopRequested = false;\n store.isRunning = false;\n runSubject.complete();\n nextSubject.complete();\n }\n };\n\n // Bridge previous events if they exist\n if (prevSubject) {\n prevSubject.subscribe({\n next: (e) => nextSubject.next(e),\n error: (err) => nextSubject.error(err),\n complete: () => {\n // Don't complete nextSubject here - it needs to stay open for new events\n },\n });\n }\n\n // Start the agent execution immediately (not lazily)\n runAgent();\n\n // Return the run subject (only agent events, no injected messages)\n return runSubject.asObservable();\n }\n\n connect(request: AgentRunnerConnectRequest): Observable<BaseEvent> {\n const store = GLOBAL_STORE.get(request.threadId);\n const connectionSubject = new ReplaySubject<BaseEvent>(Infinity);\n\n if (!store) {\n // No store means no events\n connectionSubject.complete();\n return connectionSubject.asObservable();\n }\n\n // Collect all historic events from memory\n const allHistoricEvents: BaseEvent[] = [];\n for (const run of store.historicRuns) {\n allHistoricEvents.push(...run.events);\n }\n\n // Apply compaction to all historic events together (like SQLite)\n const compactedEvents = compactEvents(allHistoricEvents);\n\n // Emit compacted events and track message IDs\n const emittedMessageIds = new Set<string>();\n for (const event of compactedEvents) {\n connectionSubject.next(event);\n if (\"messageId\" in event && typeof event.messageId === \"string\") {\n emittedMessageIds.add(event.messageId);\n }\n }\n\n // Bridge active run to connection if exists\n if (store.subject && (store.isRunning || store.stopRequested)) {\n store.subject.subscribe({\n next: (event) => {\n // Skip message events that we've already emitted from historic\n if (\n \"messageId\" in event &&\n typeof event.messageId === \"string\" &&\n emittedMessageIds.has(event.messageId)\n ) {\n return;\n }\n connectionSubject.next(event);\n },\n complete: () => connectionSubject.complete(),\n error: (err) => connectionSubject.error(err),\n });\n } else {\n // No active run, complete after historic events\n connectionSubject.complete();\n }\n\n return connectionSubject.asObservable();\n }\n\n isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean> {\n const store = GLOBAL_STORE.get(request.threadId);\n return Promise.resolve(store?.isRunning ?? false);\n }\n\n stop(request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n const store = GLOBAL_STORE.get(request.threadId);\n if (!store || !store.isRunning) {\n return Promise.resolve(false);\n }\n if (store.stopRequested) {\n return Promise.resolve(false);\n }\n\n store.stopRequested = true;\n store.isRunning = false;\n\n const agent = store.agent;\n if (!agent) {\n store.stopRequested = false;\n store.isRunning = false;\n return Promise.resolve(false);\n }\n\n try {\n agent.abortRun();\n return Promise.resolve(true);\n } catch (error) {\n console.error(\"Failed to abort agent run\", error);\n store.stopRequested = false;\n store.isRunning = true;\n return Promise.resolve(false);\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest } from "./agent-runner.cjs";
2
+ import { BaseEvent } from "@ag-ui/client";
3
+ import { Observable } from "rxjs";
4
+
5
+ //#region src/runner/in-memory.d.ts
6
+ declare class InMemoryAgentRunner extends AgentRunner {
7
+ run(request: AgentRunnerRunRequest): Observable<BaseEvent>;
8
+ connect(request: AgentRunnerConnectRequest): Observable<BaseEvent>;
9
+ isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean>;
10
+ stop(request: AgentRunnerStopRequest): Promise<boolean | undefined>;
11
+ }
12
+ //#endregion
13
+ export { InMemoryAgentRunner };
14
+ //# sourceMappingURL=in-memory.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.d.cts","names":[],"sources":["../../src/runner/in-memory.ts"],"mappings":";;;;;cAmGa,mBAAA,SAA4B,WAAA;EACvC,GAAA,CAAI,OAAA,EAAS,qBAAA,GAAwB,UAAA,CAAW,SAAA;EAiMhD,OAAA,CAAQ,OAAA,EAAS,yBAAA,GAA4B,UAAA,CAAW,SAAA;EAqDxD,SAAA,CAAU,OAAA,EAAS,2BAAA,GAA8B,OAAA;EAKjD,IAAA,CAAK,OAAA,EAAS,sBAAA,GAAyB,OAAA;AAAA"}
@@ -0,0 +1,14 @@
1
+ import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest } from "./agent-runner.mjs";
2
+ import { Observable } from "rxjs";
3
+ import { BaseEvent } from "@ag-ui/client";
4
+
5
+ //#region src/runner/in-memory.d.ts
6
+ declare class InMemoryAgentRunner extends AgentRunner {
7
+ run(request: AgentRunnerRunRequest): Observable<BaseEvent>;
8
+ connect(request: AgentRunnerConnectRequest): Observable<BaseEvent>;
9
+ isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean>;
10
+ stop(request: AgentRunnerStopRequest): Promise<boolean | undefined>;
11
+ }
12
+ //#endregion
13
+ export { InMemoryAgentRunner };
14
+ //# sourceMappingURL=in-memory.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.d.mts","names":[],"sources":["../../src/runner/in-memory.ts"],"mappings":";;;;;cAmGa,mBAAA,SAA4B,WAAA;EACvC,GAAA,CAAI,OAAA,EAAS,qBAAA,GAAwB,UAAA,CAAW,SAAA;EAiMhD,OAAA,CAAQ,OAAA,EAAS,yBAAA,GAA4B,UAAA,CAAW,SAAA;EAqDxD,SAAA,CAAU,OAAA,EAAS,2BAAA,GAA8B,OAAA;EAKjD,IAAA,CAAK,OAAA,EAAS,sBAAA,GAAyB,OAAA;AAAA"}
@@ -0,0 +1,229 @@
1
+ import { AgentRunner } from "./agent-runner.mjs";
2
+ import { ReplaySubject } from "rxjs";
3
+ import { EventType, compactEvents } from "@ag-ui/client";
4
+ import { finalizeRunEvents } from "@copilotkitnext/shared";
5
+
6
+ //#region src/runner/in-memory.ts
7
+ var InMemoryEventStore = class {
8
+ constructor(threadId) {
9
+ this.threadId = threadId;
10
+ }
11
+ /** The subject that current consumers subscribe to. */
12
+ subject = null;
13
+ /** True while a run is actively producing events. */
14
+ isRunning = false;
15
+ /** Current run ID */
16
+ currentRunId = null;
17
+ /** Historic completed runs */
18
+ historicRuns = [];
19
+ /** Currently running agent instance (if any). */
20
+ agent = null;
21
+ /** Subject returned from run() while the run is active. */
22
+ runSubject = null;
23
+ /** True once stop() has been requested but the run has not yet finalized. */
24
+ stopRequested = false;
25
+ /** Reference to the events emitted in the current run. */
26
+ currentEvents = null;
27
+ };
28
+ const GLOBAL_STORE_KEY = Symbol.for("@copilotkitnext/runtime/in-memory-store");
29
+ function getGlobalStore() {
30
+ const globalAny = globalThis;
31
+ if (!globalAny[GLOBAL_STORE_KEY]) globalAny[GLOBAL_STORE_KEY] = {
32
+ stores: /* @__PURE__ */ new Map(),
33
+ historicRunsBackup: /* @__PURE__ */ new Map()
34
+ };
35
+ const data = globalAny[GLOBAL_STORE_KEY];
36
+ if (data.stores.size === 0 && data.historicRunsBackup.size > 0) for (const [threadId, historicRuns] of data.historicRunsBackup) {
37
+ const store = new InMemoryEventStore(threadId);
38
+ store.historicRuns = historicRuns;
39
+ data.stores.set(threadId, store);
40
+ }
41
+ return data.stores;
42
+ }
43
+ function backupHistoricRuns(threadId, historicRuns) {
44
+ const globalAny = globalThis;
45
+ if (globalAny[GLOBAL_STORE_KEY]) globalAny[GLOBAL_STORE_KEY].historicRunsBackup.set(threadId, historicRuns);
46
+ }
47
+ const GLOBAL_STORE = getGlobalStore();
48
+ var InMemoryAgentRunner = class extends AgentRunner {
49
+ run(request) {
50
+ let existingStore = GLOBAL_STORE.get(request.threadId);
51
+ if (!existingStore) {
52
+ existingStore = new InMemoryEventStore(request.threadId);
53
+ GLOBAL_STORE.set(request.threadId, existingStore);
54
+ }
55
+ const store = existingStore;
56
+ if (store.isRunning) throw new Error("Thread already running");
57
+ store.isRunning = true;
58
+ store.currentRunId = request.input.runId;
59
+ store.agent = request.agent;
60
+ store.stopRequested = false;
61
+ const seenMessageIds = /* @__PURE__ */ new Set();
62
+ const currentRunEvents = [];
63
+ store.currentEvents = currentRunEvents;
64
+ const historicMessageIds = /* @__PURE__ */ new Set();
65
+ for (const run of store.historicRuns) for (const event of run.events) {
66
+ if ("messageId" in event && typeof event.messageId === "string") historicMessageIds.add(event.messageId);
67
+ if (event.type === EventType.RUN_STARTED) {
68
+ const messages = event.input?.messages ?? [];
69
+ for (const message of messages) historicMessageIds.add(message.id);
70
+ }
71
+ }
72
+ const nextSubject = new ReplaySubject(Infinity);
73
+ const prevSubject = store.subject;
74
+ store.subject = nextSubject;
75
+ const runSubject = new ReplaySubject(Infinity);
76
+ store.runSubject = runSubject;
77
+ const runAgent = async () => {
78
+ const parentRunId = store.historicRuns[store.historicRuns.length - 1]?.runId ?? null;
79
+ try {
80
+ await request.agent.runAgent(request.input, {
81
+ onEvent: ({ event }) => {
82
+ let processedEvent = event;
83
+ if (event.type === EventType.RUN_STARTED) {
84
+ const runStartedEvent = event;
85
+ if (!runStartedEvent.input) {
86
+ const sanitizedMessages = request.input.messages ? request.input.messages.filter((message) => !historicMessageIds.has(message.id)) : void 0;
87
+ const updatedInput = {
88
+ ...request.input,
89
+ ...sanitizedMessages !== void 0 ? { messages: sanitizedMessages } : {}
90
+ };
91
+ processedEvent = {
92
+ ...runStartedEvent,
93
+ input: updatedInput
94
+ };
95
+ }
96
+ }
97
+ runSubject.next(processedEvent);
98
+ nextSubject.next(processedEvent);
99
+ currentRunEvents.push(processedEvent);
100
+ },
101
+ onNewMessage: ({ message }) => {
102
+ if (!seenMessageIds.has(message.id)) seenMessageIds.add(message.id);
103
+ },
104
+ onRunStartedEvent: () => {
105
+ if (request.input.messages) {
106
+ for (const message of request.input.messages) if (!seenMessageIds.has(message.id)) seenMessageIds.add(message.id);
107
+ }
108
+ }
109
+ });
110
+ const appendedEvents = finalizeRunEvents(currentRunEvents, { stopRequested: store.stopRequested });
111
+ for (const event of appendedEvents) {
112
+ runSubject.next(event);
113
+ nextSubject.next(event);
114
+ }
115
+ if (store.currentRunId) {
116
+ const compactedEvents = compactEvents(currentRunEvents);
117
+ store.historicRuns.push({
118
+ threadId: request.threadId,
119
+ runId: store.currentRunId,
120
+ parentRunId,
121
+ events: compactedEvents,
122
+ createdAt: Date.now()
123
+ });
124
+ backupHistoricRuns(request.threadId, store.historicRuns);
125
+ }
126
+ store.currentEvents = null;
127
+ store.currentRunId = null;
128
+ store.agent = null;
129
+ store.runSubject = null;
130
+ store.stopRequested = false;
131
+ store.isRunning = false;
132
+ runSubject.complete();
133
+ nextSubject.complete();
134
+ } catch (error) {
135
+ const interruptionMessage = error instanceof Error ? error.message : String(error);
136
+ const appendedEvents = finalizeRunEvents(currentRunEvents, {
137
+ stopRequested: store.stopRequested,
138
+ interruptionMessage
139
+ });
140
+ for (const event of appendedEvents) {
141
+ runSubject.next(event);
142
+ nextSubject.next(event);
143
+ }
144
+ if (store.currentRunId && currentRunEvents.length > 0) {
145
+ const compactedEvents = compactEvents(currentRunEvents);
146
+ store.historicRuns.push({
147
+ threadId: request.threadId,
148
+ runId: store.currentRunId,
149
+ parentRunId,
150
+ events: compactedEvents,
151
+ createdAt: Date.now()
152
+ });
153
+ backupHistoricRuns(request.threadId, store.historicRuns);
154
+ }
155
+ store.currentEvents = null;
156
+ store.currentRunId = null;
157
+ store.agent = null;
158
+ store.runSubject = null;
159
+ store.stopRequested = false;
160
+ store.isRunning = false;
161
+ runSubject.complete();
162
+ nextSubject.complete();
163
+ }
164
+ };
165
+ if (prevSubject) prevSubject.subscribe({
166
+ next: (e) => nextSubject.next(e),
167
+ error: (err) => nextSubject.error(err),
168
+ complete: () => {}
169
+ });
170
+ runAgent();
171
+ return runSubject.asObservable();
172
+ }
173
+ connect(request) {
174
+ const store = GLOBAL_STORE.get(request.threadId);
175
+ const connectionSubject = new ReplaySubject(Infinity);
176
+ if (!store) {
177
+ connectionSubject.complete();
178
+ return connectionSubject.asObservable();
179
+ }
180
+ const allHistoricEvents = [];
181
+ for (const run of store.historicRuns) allHistoricEvents.push(...run.events);
182
+ const compactedEvents = compactEvents(allHistoricEvents);
183
+ const emittedMessageIds = /* @__PURE__ */ new Set();
184
+ for (const event of compactedEvents) {
185
+ connectionSubject.next(event);
186
+ if ("messageId" in event && typeof event.messageId === "string") emittedMessageIds.add(event.messageId);
187
+ }
188
+ if (store.subject && (store.isRunning || store.stopRequested)) store.subject.subscribe({
189
+ next: (event) => {
190
+ if ("messageId" in event && typeof event.messageId === "string" && emittedMessageIds.has(event.messageId)) return;
191
+ connectionSubject.next(event);
192
+ },
193
+ complete: () => connectionSubject.complete(),
194
+ error: (err) => connectionSubject.error(err)
195
+ });
196
+ else connectionSubject.complete();
197
+ return connectionSubject.asObservable();
198
+ }
199
+ isRunning(request) {
200
+ const store = GLOBAL_STORE.get(request.threadId);
201
+ return Promise.resolve(store?.isRunning ?? false);
202
+ }
203
+ stop(request) {
204
+ const store = GLOBAL_STORE.get(request.threadId);
205
+ if (!store || !store.isRunning) return Promise.resolve(false);
206
+ if (store.stopRequested) return Promise.resolve(false);
207
+ store.stopRequested = true;
208
+ store.isRunning = false;
209
+ const agent = store.agent;
210
+ if (!agent) {
211
+ store.stopRequested = false;
212
+ store.isRunning = false;
213
+ return Promise.resolve(false);
214
+ }
215
+ try {
216
+ agent.abortRun();
217
+ return Promise.resolve(true);
218
+ } catch (error) {
219
+ console.error("Failed to abort agent run", error);
220
+ store.stopRequested = false;
221
+ store.isRunning = true;
222
+ return Promise.resolve(false);
223
+ }
224
+ }
225
+ };
226
+
227
+ //#endregion
228
+ export { InMemoryAgentRunner };
229
+ //# sourceMappingURL=in-memory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory.mjs","names":[],"sources":["../../src/runner/in-memory.ts"],"sourcesContent":["import {\n AgentRunner,\n AgentRunnerConnectRequest,\n AgentRunnerIsRunningRequest,\n AgentRunnerRunRequest,\n type AgentRunnerStopRequest,\n} from \"./agent-runner\";\nimport { Observable, ReplaySubject } from \"rxjs\";\nimport {\n AbstractAgent,\n BaseEvent,\n EventType,\n MessagesSnapshotEvent,\n RunStartedEvent,\n compactEvents,\n} from \"@ag-ui/client\";\nimport { finalizeRunEvents } from \"@copilotkitnext/shared\";\n\ninterface HistoricRun {\n threadId: string;\n runId: string;\n parentRunId: string | null;\n events: BaseEvent[];\n createdAt: number;\n}\n\nclass InMemoryEventStore {\n constructor(public threadId: string) {}\n\n /** The subject that current consumers subscribe to. */\n subject: ReplaySubject<BaseEvent> | null = null;\n\n /** True while a run is actively producing events. */\n isRunning = false;\n\n /** Current run ID */\n currentRunId: string | null = null;\n\n /** Historic completed runs */\n historicRuns: HistoricRun[] = [];\n\n /** Currently running agent instance (if any). */\n agent: AbstractAgent | null = null;\n\n /** Subject returned from run() while the run is active. */\n runSubject: ReplaySubject<BaseEvent> | null = null;\n\n /** True once stop() has been requested but the run has not yet finalized. */\n stopRequested = false;\n\n /** Reference to the events emitted in the current run. */\n currentEvents: BaseEvent[] | null = null;\n}\n\n// Use a symbol key on globalThis to survive hot reloads in development\nconst GLOBAL_STORE_KEY = Symbol.for(\"@copilotkitnext/runtime/in-memory-store\");\n\ninterface GlobalStoreData {\n stores: Map<string, InMemoryEventStore>;\n historicRunsBackup: Map<string, HistoricRun[]>;\n}\n\nfunction getGlobalStore(): Map<string, InMemoryEventStore> {\n const globalAny = globalThis as unknown as Record<symbol, GlobalStoreData>;\n\n if (!globalAny[GLOBAL_STORE_KEY]) {\n globalAny[GLOBAL_STORE_KEY] = {\n stores: new Map<string, InMemoryEventStore>(),\n historicRunsBackup: new Map<string, HistoricRun[]>(),\n };\n }\n\n const data = globalAny[GLOBAL_STORE_KEY];\n\n // Restore historic runs from backup after hot reload\n // (when stores map is empty but backup has data)\n if (data.stores.size === 0 && data.historicRunsBackup.size > 0) {\n for (const [threadId, historicRuns] of data.historicRunsBackup) {\n const store = new InMemoryEventStore(threadId);\n store.historicRuns = historicRuns;\n data.stores.set(threadId, store);\n }\n }\n\n return data.stores;\n}\n\nfunction backupHistoricRuns(\n threadId: string,\n historicRuns: HistoricRun[],\n): void {\n const globalAny = globalThis as unknown as Record<symbol, GlobalStoreData>;\n if (globalAny[GLOBAL_STORE_KEY]) {\n globalAny[GLOBAL_STORE_KEY].historicRunsBackup.set(threadId, historicRuns);\n }\n}\n\nconst GLOBAL_STORE = getGlobalStore();\n\nexport class InMemoryAgentRunner extends AgentRunner {\n run(request: AgentRunnerRunRequest): Observable<BaseEvent> {\n let existingStore = GLOBAL_STORE.get(request.threadId);\n if (!existingStore) {\n existingStore = new InMemoryEventStore(request.threadId);\n GLOBAL_STORE.set(request.threadId, existingStore);\n }\n const store = existingStore; // Now store is const and non-null\n\n if (store.isRunning) {\n throw new Error(\"Thread already running\");\n }\n store.isRunning = true;\n store.currentRunId = request.input.runId;\n store.agent = request.agent;\n store.stopRequested = false;\n\n // Track seen message IDs and current run events for this run\n const seenMessageIds = new Set<string>();\n const currentRunEvents: BaseEvent[] = [];\n store.currentEvents = currentRunEvents;\n\n // Get all previously seen message IDs from historic runs\n const historicMessageIds = new Set<string>();\n for (const run of store.historicRuns) {\n for (const event of run.events) {\n if (\"messageId\" in event && typeof event.messageId === \"string\") {\n historicMessageIds.add(event.messageId);\n }\n if (event.type === EventType.RUN_STARTED) {\n const runStarted = event as RunStartedEvent;\n const messages = runStarted.input?.messages ?? [];\n for (const message of messages) {\n historicMessageIds.add(message.id);\n }\n }\n }\n }\n\n const nextSubject = new ReplaySubject<BaseEvent>(Infinity);\n const prevSubject = store.subject;\n\n // Update the store's subject immediately\n store.subject = nextSubject;\n\n // Create a subject for run() return value\n const runSubject = new ReplaySubject<BaseEvent>(Infinity);\n store.runSubject = runSubject;\n\n // Helper function to run the agent and handle errors\n const runAgent = async () => {\n // Get parent run ID for chaining\n const lastRun = store.historicRuns[store.historicRuns.length - 1];\n const parentRunId = lastRun?.runId ?? null;\n\n try {\n await request.agent.runAgent(request.input, {\n onEvent: ({ event }) => {\n let processedEvent: BaseEvent = event;\n if (event.type === EventType.RUN_STARTED) {\n const runStartedEvent = event as RunStartedEvent;\n if (!runStartedEvent.input) {\n const sanitizedMessages = request.input.messages\n ? request.input.messages.filter(\n (message) => !historicMessageIds.has(message.id),\n )\n : undefined;\n const updatedInput = {\n ...request.input,\n ...(sanitizedMessages !== undefined\n ? { messages: sanitizedMessages }\n : {}),\n };\n processedEvent = {\n ...runStartedEvent,\n input: updatedInput,\n } as RunStartedEvent;\n }\n }\n\n runSubject.next(processedEvent); // For run() return - only agent events\n nextSubject.next(processedEvent); // For connect() / store - all events\n currentRunEvents.push(processedEvent); // Accumulate for storage\n },\n onNewMessage: ({ message }) => {\n // Called for each new message\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n },\n onRunStartedEvent: () => {\n // Mark any messages from the input as seen so they aren't emitted twice\n if (request.input.messages) {\n for (const message of request.input.messages) {\n if (!seenMessageIds.has(message.id)) {\n seenMessageIds.add(message.id);\n }\n }\n }\n },\n });\n\n const appendedEvents = finalizeRunEvents(currentRunEvents, {\n stopRequested: store.stopRequested,\n });\n for (const event of appendedEvents) {\n runSubject.next(event);\n nextSubject.next(event);\n }\n\n // Store the completed run in memory with ONLY its events\n if (store.currentRunId) {\n // Compact the events before storing (like SQLite does)\n const compactedEvents = compactEvents(currentRunEvents);\n\n store.historicRuns.push({\n threadId: request.threadId,\n runId: store.currentRunId,\n parentRunId,\n events: compactedEvents,\n createdAt: Date.now(),\n });\n\n // Backup for hot reload survival\n backupHistoricRuns(request.threadId, store.historicRuns);\n }\n\n // Complete the run\n store.currentEvents = null;\n store.currentRunId = null;\n store.agent = null;\n store.runSubject = null;\n store.stopRequested = false;\n store.isRunning = false;\n runSubject.complete();\n nextSubject.complete();\n } catch (error) {\n const interruptionMessage =\n error instanceof Error ? error.message : String(error);\n const appendedEvents = finalizeRunEvents(currentRunEvents, {\n stopRequested: store.stopRequested,\n interruptionMessage,\n });\n for (const event of appendedEvents) {\n runSubject.next(event);\n nextSubject.next(event);\n }\n\n // Store the run even if it failed (partial events)\n if (store.currentRunId && currentRunEvents.length > 0) {\n // Compact the events before storing (like SQLite does)\n const compactedEvents = compactEvents(currentRunEvents);\n store.historicRuns.push({\n threadId: request.threadId,\n runId: store.currentRunId,\n parentRunId,\n events: compactedEvents,\n createdAt: Date.now(),\n });\n\n // Backup for hot reload survival\n backupHistoricRuns(request.threadId, store.historicRuns);\n }\n\n // Complete the run\n store.currentEvents = null;\n store.currentRunId = null;\n store.agent = null;\n store.runSubject = null;\n store.stopRequested = false;\n store.isRunning = false;\n runSubject.complete();\n nextSubject.complete();\n }\n };\n\n // Bridge previous events if they exist\n if (prevSubject) {\n prevSubject.subscribe({\n next: (e) => nextSubject.next(e),\n error: (err) => nextSubject.error(err),\n complete: () => {\n // Don't complete nextSubject here - it needs to stay open for new events\n },\n });\n }\n\n // Start the agent execution immediately (not lazily)\n runAgent();\n\n // Return the run subject (only agent events, no injected messages)\n return runSubject.asObservable();\n }\n\n connect(request: AgentRunnerConnectRequest): Observable<BaseEvent> {\n const store = GLOBAL_STORE.get(request.threadId);\n const connectionSubject = new ReplaySubject<BaseEvent>(Infinity);\n\n if (!store) {\n // No store means no events\n connectionSubject.complete();\n return connectionSubject.asObservable();\n }\n\n // Collect all historic events from memory\n const allHistoricEvents: BaseEvent[] = [];\n for (const run of store.historicRuns) {\n allHistoricEvents.push(...run.events);\n }\n\n // Apply compaction to all historic events together (like SQLite)\n const compactedEvents = compactEvents(allHistoricEvents);\n\n // Emit compacted events and track message IDs\n const emittedMessageIds = new Set<string>();\n for (const event of compactedEvents) {\n connectionSubject.next(event);\n if (\"messageId\" in event && typeof event.messageId === \"string\") {\n emittedMessageIds.add(event.messageId);\n }\n }\n\n // Bridge active run to connection if exists\n if (store.subject && (store.isRunning || store.stopRequested)) {\n store.subject.subscribe({\n next: (event) => {\n // Skip message events that we've already emitted from historic\n if (\n \"messageId\" in event &&\n typeof event.messageId === \"string\" &&\n emittedMessageIds.has(event.messageId)\n ) {\n return;\n }\n connectionSubject.next(event);\n },\n complete: () => connectionSubject.complete(),\n error: (err) => connectionSubject.error(err),\n });\n } else {\n // No active run, complete after historic events\n connectionSubject.complete();\n }\n\n return connectionSubject.asObservable();\n }\n\n isRunning(request: AgentRunnerIsRunningRequest): Promise<boolean> {\n const store = GLOBAL_STORE.get(request.threadId);\n return Promise.resolve(store?.isRunning ?? false);\n }\n\n stop(request: AgentRunnerStopRequest): Promise<boolean | undefined> {\n const store = GLOBAL_STORE.get(request.threadId);\n if (!store || !store.isRunning) {\n return Promise.resolve(false);\n }\n if (store.stopRequested) {\n return Promise.resolve(false);\n }\n\n store.stopRequested = true;\n store.isRunning = false;\n\n const agent = store.agent;\n if (!agent) {\n store.stopRequested = false;\n store.isRunning = false;\n return Promise.resolve(false);\n }\n\n try {\n agent.abortRun();\n return Promise.resolve(true);\n } catch (error) {\n console.error(\"Failed to abort agent run\", error);\n store.stopRequested = false;\n store.isRunning = true;\n return Promise.resolve(false);\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
2
+ const require_agent_runner = require('./agent-runner.cjs');
3
+ const require_in_memory = require('./in-memory.cjs');
4
+ let _copilotkitnext_shared = require("@copilotkitnext/shared");
@@ -0,0 +1,4 @@
1
+ import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest } from "./agent-runner.cjs";
2
+ import { InMemoryAgentRunner } from "./in-memory.cjs";
3
+ import { finalizeRunEvents } from "@copilotkitnext/shared";
4
+ export { finalizeRunEvents };
@@ -0,0 +1,4 @@
1
+ import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest } from "./agent-runner.mjs";
2
+ import { InMemoryAgentRunner } from "./in-memory.mjs";
3
+ import { finalizeRunEvents as finalizeRunEvents$1 } from "@copilotkitnext/shared";
4
+ export { finalizeRunEvents$1 as finalizeRunEvents };
@@ -0,0 +1,5 @@
1
+ import { AgentRunner } from "./agent-runner.mjs";
2
+ import { InMemoryAgentRunner } from "./in-memory.mjs";
3
+ import { finalizeRunEvents as finalizeRunEvents$1 } from "@copilotkitnext/shared";
4
+
5
+ export { finalizeRunEvents$1 as finalizeRunEvents };
@@ -0,0 +1,27 @@
1
+ const require_package = require('./package.cjs');
2
+ const require_in_memory = require('./runner/in-memory.cjs');
3
+
4
+ //#region src/runtime.ts
5
+ const VERSION = require_package.version;
6
+ /**
7
+ * Central runtime object passed to all request handlers.
8
+ */
9
+ var CopilotRuntime = class {
10
+ agents;
11
+ transcriptionService;
12
+ beforeRequestMiddleware;
13
+ afterRequestMiddleware;
14
+ runner;
15
+ constructor({ agents, transcriptionService, beforeRequestMiddleware, afterRequestMiddleware, runner }) {
16
+ this.agents = agents;
17
+ this.transcriptionService = transcriptionService;
18
+ this.beforeRequestMiddleware = beforeRequestMiddleware;
19
+ this.afterRequestMiddleware = afterRequestMiddleware;
20
+ this.runner = runner ?? new require_in_memory.InMemoryAgentRunner();
21
+ }
22
+ };
23
+
24
+ //#endregion
25
+ exports.CopilotRuntime = CopilotRuntime;
26
+ exports.VERSION = VERSION;
27
+ //# sourceMappingURL=runtime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.cjs","names":["InMemoryAgentRunner"],"sources":["../src/runtime.ts"],"sourcesContent":["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"],"mappings":";;;;AAWA,MAAa;;;;AAqBb,IAAa,iBAAb,MAA4B;CAC1B,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CACP,AAAO;CAEP,YAAY,EACV,QACA,sBACA,yBACA,wBACA,UACwB;AACxB,OAAK,SAAS;AACd,OAAK,uBAAuB;AAC5B,OAAK,0BAA0B;AAC/B,OAAK,yBAAyB;AAC9B,OAAK,SAAS,UAAU,IAAIA,uCAAqB"}