mojentic 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +459 -0
  3. package/dist/agents/async-aggregator-agent.d.ts +101 -0
  4. package/dist/agents/async-aggregator-agent.d.ts.map +1 -0
  5. package/dist/agents/async-aggregator-agent.js +160 -0
  6. package/dist/agents/async-aggregator-agent.js.map +1 -0
  7. package/dist/agents/async-dispatcher.d.ts +98 -0
  8. package/dist/agents/async-dispatcher.d.ts.map +1 -0
  9. package/dist/agents/async-dispatcher.js +173 -0
  10. package/dist/agents/async-dispatcher.js.map +1 -0
  11. package/dist/agents/async-llm-agent-with-memory.d.ts +95 -0
  12. package/dist/agents/async-llm-agent-with-memory.d.ts.map +1 -0
  13. package/dist/agents/async-llm-agent-with-memory.js +136 -0
  14. package/dist/agents/async-llm-agent-with-memory.js.map +1 -0
  15. package/dist/agents/async-llm-agent.d.ts +85 -0
  16. package/dist/agents/async-llm-agent.d.ts.map +1 -0
  17. package/dist/agents/async-llm-agent.js +87 -0
  18. package/dist/agents/async-llm-agent.js.map +1 -0
  19. package/dist/agents/base-agent.d.ts +59 -0
  20. package/dist/agents/base-agent.d.ts.map +1 -0
  21. package/dist/agents/base-agent.js +24 -0
  22. package/dist/agents/base-agent.js.map +1 -0
  23. package/dist/agents/base-async-agent.d.ts +42 -0
  24. package/dist/agents/base-async-agent.d.ts.map +1 -0
  25. package/dist/agents/base-async-agent.js +6 -0
  26. package/dist/agents/base-async-agent.js.map +1 -0
  27. package/dist/agents/event.d.ts +26 -0
  28. package/dist/agents/event.d.ts.map +1 -0
  29. package/dist/agents/event.js +13 -0
  30. package/dist/agents/event.js.map +1 -0
  31. package/dist/agents/index.d.ts +14 -0
  32. package/dist/agents/index.d.ts.map +1 -0
  33. package/dist/agents/index.js +30 -0
  34. package/dist/agents/index.js.map +1 -0
  35. package/dist/agents/iterative-problem-solver.d.ts +83 -0
  36. package/dist/agents/iterative-problem-solver.d.ts.map +1 -0
  37. package/dist/agents/iterative-problem-solver.js +120 -0
  38. package/dist/agents/iterative-problem-solver.js.map +1 -0
  39. package/dist/agents/router.d.ts +44 -0
  40. package/dist/agents/router.d.ts.map +1 -0
  41. package/dist/agents/router.js +53 -0
  42. package/dist/agents/router.js.map +1 -0
  43. package/dist/agents/simple-recursive-agent.d.ts +182 -0
  44. package/dist/agents/simple-recursive-agent.d.ts.map +1 -0
  45. package/dist/agents/simple-recursive-agent.js +272 -0
  46. package/dist/agents/simple-recursive-agent.js.map +1 -0
  47. package/dist/context/index.d.ts +5 -0
  48. package/dist/context/index.d.ts.map +1 -0
  49. package/dist/context/index.js +21 -0
  50. package/dist/context/index.js.map +1 -0
  51. package/dist/context/shared-working-memory.d.ts +76 -0
  52. package/dist/context/shared-working-memory.d.ts.map +1 -0
  53. package/dist/context/shared-working-memory.js +121 -0
  54. package/dist/context/shared-working-memory.js.map +1 -0
  55. package/dist/error.d.ts +93 -0
  56. package/dist/error.d.ts.map +1 -0
  57. package/dist/error.js +149 -0
  58. package/dist/error.js.map +1 -0
  59. package/dist/examples/react/decisioning-agent.d.ts +48 -0
  60. package/dist/examples/react/decisioning-agent.d.ts.map +1 -0
  61. package/dist/examples/react/decisioning-agent.js +204 -0
  62. package/dist/examples/react/decisioning-agent.js.map +1 -0
  63. package/dist/examples/react/events.d.ts +77 -0
  64. package/dist/examples/react/events.d.ts.map +1 -0
  65. package/dist/examples/react/events.js +9 -0
  66. package/dist/examples/react/events.js.map +1 -0
  67. package/dist/examples/react/formatters.d.ts +23 -0
  68. package/dist/examples/react/formatters.d.ts.map +1 -0
  69. package/dist/examples/react/formatters.js +68 -0
  70. package/dist/examples/react/formatters.js.map +1 -0
  71. package/dist/examples/react/index.d.ts +12 -0
  72. package/dist/examples/react/index.d.ts.map +1 -0
  73. package/dist/examples/react/index.js +28 -0
  74. package/dist/examples/react/index.js.map +1 -0
  75. package/dist/examples/react/models.d.ts +57 -0
  76. package/dist/examples/react/models.d.ts.map +1 -0
  77. package/dist/examples/react/models.js +19 -0
  78. package/dist/examples/react/models.js.map +1 -0
  79. package/dist/examples/react/output-agent.d.ts +23 -0
  80. package/dist/examples/react/output-agent.d.ts.map +1 -0
  81. package/dist/examples/react/output-agent.js +28 -0
  82. package/dist/examples/react/output-agent.js.map +1 -0
  83. package/dist/examples/react/summarization-agent.d.ts +46 -0
  84. package/dist/examples/react/summarization-agent.d.ts.map +1 -0
  85. package/dist/examples/react/summarization-agent.js +102 -0
  86. package/dist/examples/react/summarization-agent.js.map +1 -0
  87. package/dist/examples/react/thinking-agent.d.ts +47 -0
  88. package/dist/examples/react/thinking-agent.d.ts.map +1 -0
  89. package/dist/examples/react/thinking-agent.js +127 -0
  90. package/dist/examples/react/thinking-agent.js.map +1 -0
  91. package/dist/examples/react/tool-call-agent.d.ts +25 -0
  92. package/dist/examples/react/tool-call-agent.d.ts.map +1 -0
  93. package/dist/examples/react/tool-call-agent.js +83 -0
  94. package/dist/examples/react/tool-call-agent.js.map +1 -0
  95. package/dist/index.d.ts +10 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +28 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/llm/agent.d.ts +68 -0
  100. package/dist/llm/agent.d.ts.map +1 -0
  101. package/dist/llm/agent.js +85 -0
  102. package/dist/llm/agent.js.map +1 -0
  103. package/dist/llm/broker.d.ts +150 -0
  104. package/dist/llm/broker.d.ts.map +1 -0
  105. package/dist/llm/broker.js +355 -0
  106. package/dist/llm/broker.js.map +1 -0
  107. package/dist/llm/chat-session.d.ts +98 -0
  108. package/dist/llm/chat-session.d.ts.map +1 -0
  109. package/dist/llm/chat-session.js +156 -0
  110. package/dist/llm/chat-session.js.map +1 -0
  111. package/dist/llm/gateway.d.ts +28 -0
  112. package/dist/llm/gateway.d.ts.map +1 -0
  113. package/dist/llm/gateway.js +6 -0
  114. package/dist/llm/gateway.js.map +1 -0
  115. package/dist/llm/gateways/index.d.ts +9 -0
  116. package/dist/llm/gateways/index.d.ts.map +1 -0
  117. package/dist/llm/gateways/index.js +25 -0
  118. package/dist/llm/gateways/index.js.map +1 -0
  119. package/dist/llm/gateways/ollama.d.ts +30 -0
  120. package/dist/llm/gateways/ollama.d.ts.map +1 -0
  121. package/dist/llm/gateways/ollama.js +322 -0
  122. package/dist/llm/gateways/ollama.js.map +1 -0
  123. package/dist/llm/gateways/openai-messages-adapter.d.ts +29 -0
  124. package/dist/llm/gateways/openai-messages-adapter.d.ts.map +1 -0
  125. package/dist/llm/gateways/openai-messages-adapter.js +188 -0
  126. package/dist/llm/gateways/openai-messages-adapter.js.map +1 -0
  127. package/dist/llm/gateways/openai-model-registry.d.ts +82 -0
  128. package/dist/llm/gateways/openai-model-registry.d.ts.map +1 -0
  129. package/dist/llm/gateways/openai-model-registry.js +352 -0
  130. package/dist/llm/gateways/openai-model-registry.js.map +1 -0
  131. package/dist/llm/gateways/openai.d.ts +40 -0
  132. package/dist/llm/gateways/openai.d.ts.map +1 -0
  133. package/dist/llm/gateways/openai.js +469 -0
  134. package/dist/llm/gateways/openai.js.map +1 -0
  135. package/dist/llm/gateways/tokenizerGateway.d.ts +61 -0
  136. package/dist/llm/gateways/tokenizerGateway.d.ts.map +1 -0
  137. package/dist/llm/gateways/tokenizerGateway.js +75 -0
  138. package/dist/llm/gateways/tokenizerGateway.js.map +1 -0
  139. package/dist/llm/index.d.ts +11 -0
  140. package/dist/llm/index.d.ts.map +1 -0
  141. package/dist/llm/index.js +27 -0
  142. package/dist/llm/index.js.map +1 -0
  143. package/dist/llm/models.d.ts +95 -0
  144. package/dist/llm/models.d.ts.map +1 -0
  145. package/dist/llm/models.js +50 -0
  146. package/dist/llm/models.js.map +1 -0
  147. package/dist/llm/tools/ask-user.d.ts +39 -0
  148. package/dist/llm/tools/ask-user.d.ts.map +1 -0
  149. package/dist/llm/tools/ask-user.js +111 -0
  150. package/dist/llm/tools/ask-user.js.map +1 -0
  151. package/dist/llm/tools/current-datetime.d.ts +17 -0
  152. package/dist/llm/tools/current-datetime.d.ts.map +1 -0
  153. package/dist/llm/tools/current-datetime.js +76 -0
  154. package/dist/llm/tools/current-datetime.js.map +1 -0
  155. package/dist/llm/tools/date-resolver.d.ts +17 -0
  156. package/dist/llm/tools/date-resolver.d.ts.map +1 -0
  157. package/dist/llm/tools/date-resolver.js +135 -0
  158. package/dist/llm/tools/date-resolver.js.map +1 -0
  159. package/dist/llm/tools/ephemeral-task-manager/append-task.d.ts +13 -0
  160. package/dist/llm/tools/ephemeral-task-manager/append-task.d.ts.map +1 -0
  161. package/dist/llm/tools/ephemeral-task-manager/append-task.js +54 -0
  162. package/dist/llm/tools/ephemeral-task-manager/append-task.js.map +1 -0
  163. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.d.ts +13 -0
  164. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.d.ts.map +1 -0
  165. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.js +37 -0
  166. package/dist/llm/tools/ephemeral-task-manager/clear-tasks.js.map +1 -0
  167. package/dist/llm/tools/ephemeral-task-manager/complete-task.d.ts +15 -0
  168. package/dist/llm/tools/ephemeral-task-manager/complete-task.d.ts.map +1 -0
  169. package/dist/llm/tools/ephemeral-task-manager/complete-task.js +56 -0
  170. package/dist/llm/tools/ephemeral-task-manager/complete-task.js.map +1 -0
  171. package/dist/llm/tools/ephemeral-task-manager/index.d.ts +44 -0
  172. package/dist/llm/tools/ephemeral-task-manager/index.d.ts.map +1 -0
  173. package/dist/llm/tools/ephemeral-task-manager/index.js +73 -0
  174. package/dist/llm/tools/ephemeral-task-manager/index.js.map +1 -0
  175. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.d.ts +13 -0
  176. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.d.ts.map +1 -0
  177. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.js +59 -0
  178. package/dist/llm/tools/ephemeral-task-manager/insert-task-after.js.map +1 -0
  179. package/dist/llm/tools/ephemeral-task-manager/list-tasks.d.ts +14 -0
  180. package/dist/llm/tools/ephemeral-task-manager/list-tasks.d.ts.map +1 -0
  181. package/dist/llm/tools/ephemeral-task-manager/list-tasks.js +45 -0
  182. package/dist/llm/tools/ephemeral-task-manager/list-tasks.js.map +1 -0
  183. package/dist/llm/tools/ephemeral-task-manager/prepend-task.d.ts +13 -0
  184. package/dist/llm/tools/ephemeral-task-manager/prepend-task.d.ts.map +1 -0
  185. package/dist/llm/tools/ephemeral-task-manager/prepend-task.js +54 -0
  186. package/dist/llm/tools/ephemeral-task-manager/prepend-task.js.map +1 -0
  187. package/dist/llm/tools/ephemeral-task-manager/start-task.d.ts +15 -0
  188. package/dist/llm/tools/ephemeral-task-manager/start-task.d.ts.map +1 -0
  189. package/dist/llm/tools/ephemeral-task-manager/start-task.js +56 -0
  190. package/dist/llm/tools/ephemeral-task-manager/start-task.js.map +1 -0
  191. package/dist/llm/tools/ephemeral-task-manager/task-list.d.ts +68 -0
  192. package/dist/llm/tools/ephemeral-task-manager/task-list.d.ts.map +1 -0
  193. package/dist/llm/tools/ephemeral-task-manager/task-list.js +120 -0
  194. package/dist/llm/tools/ephemeral-task-manager/task-list.js.map +1 -0
  195. package/dist/llm/tools/ephemeral-task-manager/task.d.ts +21 -0
  196. package/dist/llm/tools/ephemeral-task-manager/task.d.ts.map +1 -0
  197. package/dist/llm/tools/ephemeral-task-manager/task.js +24 -0
  198. package/dist/llm/tools/ephemeral-task-manager/task.js.map +1 -0
  199. package/dist/llm/tools/file-manager.d.ts +127 -0
  200. package/dist/llm/tools/file-manager.d.ts.map +1 -0
  201. package/dist/llm/tools/file-manager.js +598 -0
  202. package/dist/llm/tools/file-manager.js.map +1 -0
  203. package/dist/llm/tools/index.d.ts +11 -0
  204. package/dist/llm/tools/index.d.ts.map +1 -0
  205. package/dist/llm/tools/index.js +27 -0
  206. package/dist/llm/tools/index.js.map +1 -0
  207. package/dist/llm/tools/tell-user.d.ts +31 -0
  208. package/dist/llm/tools/tell-user.d.ts.map +1 -0
  209. package/dist/llm/tools/tell-user.js +57 -0
  210. package/dist/llm/tools/tell-user.js.map +1 -0
  211. package/dist/llm/tools/tool-wrapper.d.ts +54 -0
  212. package/dist/llm/tools/tool-wrapper.d.ts.map +1 -0
  213. package/dist/llm/tools/tool-wrapper.js +91 -0
  214. package/dist/llm/tools/tool-wrapper.js.map +1 -0
  215. package/dist/llm/tools/tool.d.ts +70 -0
  216. package/dist/llm/tools/tool.d.ts.map +1 -0
  217. package/dist/llm/tools/tool.js +19 -0
  218. package/dist/llm/tools/tool.js.map +1 -0
  219. package/dist/llm/tools/web-search-tool.d.ts +35 -0
  220. package/dist/llm/tools/web-search-tool.d.ts.map +1 -0
  221. package/dist/llm/tools/web-search-tool.js +105 -0
  222. package/dist/llm/tools/web-search-tool.js.map +1 -0
  223. package/dist/llm/utils/image.d.ts +30 -0
  224. package/dist/llm/utils/image.d.ts.map +1 -0
  225. package/dist/llm/utils/image.js +65 -0
  226. package/dist/llm/utils/image.js.map +1 -0
  227. package/dist/tracer/eventStore.d.ts +101 -0
  228. package/dist/tracer/eventStore.d.ts.map +1 -0
  229. package/dist/tracer/eventStore.js +120 -0
  230. package/dist/tracer/eventStore.js.map +1 -0
  231. package/dist/tracer/index.d.ts +8 -0
  232. package/dist/tracer/index.d.ts.map +1 -0
  233. package/dist/tracer/index.js +24 -0
  234. package/dist/tracer/index.js.map +1 -0
  235. package/dist/tracer/nullTracer.d.ts +127 -0
  236. package/dist/tracer/nullTracer.d.ts.map +1 -0
  237. package/dist/tracer/nullTracer.js +148 -0
  238. package/dist/tracer/nullTracer.js.map +1 -0
  239. package/dist/tracer/tracerEvents.d.ts +209 -0
  240. package/dist/tracer/tracerEvents.d.ts.map +1 -0
  241. package/dist/tracer/tracerEvents.js +312 -0
  242. package/dist/tracer/tracerEvents.js.map +1 -0
  243. package/dist/tracer/tracerSystem.d.ts +149 -0
  244. package/dist/tracer/tracerSystem.d.ts.map +1 -0
  245. package/dist/tracer/tracerSystem.js +196 -0
  246. package/dist/tracer/tracerSystem.js.map +1 -0
  247. package/package.json +87 -0
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Async Aggregator Agent - Collects and processes multiple related events
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AsyncAggregatorAgent = void 0;
7
+ const error_1 = require("../error");
8
+ /**
9
+ * Base class for agents that aggregate multiple events before processing.
10
+ *
11
+ * This agent collects events with the same correlation ID until all required
12
+ * event types have been received, then calls `processEvents` with the complete set.
13
+ *
14
+ * Useful for workflows where multiple agents process parts of a request in parallel,
15
+ * and a final agent combines their results.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * class FinalAnswerAgent extends AsyncAggregatorAgent {
20
+ * constructor() {
21
+ * super(['FactCheckEvent', 'AnswerEvent']);
22
+ * }
23
+ *
24
+ * async processEvents(events: Event[]): Promise<Result<Event[], Error>> {
25
+ * const facts = events.find(e => e.type === 'FactCheckEvent') as FactCheckEvent;
26
+ * const answer = events.find(e => e.type === 'AnswerEvent') as AnswerEvent;
27
+ *
28
+ * return Ok([new FinalAnswerEvent({
29
+ * answer: answer.answer,
30
+ * facts: facts.facts
31
+ * })]);
32
+ * }
33
+ * }
34
+ * ```
35
+ */
36
+ class AsyncAggregatorAgent {
37
+ /** Map of correlation IDs to accumulated events */
38
+ results = new Map();
39
+ /** Map of correlation IDs to waiting promise resolvers */
40
+ waiters = new Map();
41
+ /** Event type names that must be collected before processing */
42
+ eventTypesNeeded;
43
+ /**
44
+ * Create a new aggregator agent.
45
+ *
46
+ * @param eventTypesNeeded - Array of event type names to wait for
47
+ */
48
+ constructor(eventTypesNeeded) {
49
+ this.eventTypesNeeded = eventTypesNeeded;
50
+ }
51
+ /**
52
+ * Check if all required event types have been received for a correlation ID.
53
+ *
54
+ * @param correlationId - The correlation ID to check
55
+ * @returns True if all needed event types are present
56
+ */
57
+ hasAllNeeded(correlationId) {
58
+ const events = this.results.get(correlationId) || [];
59
+ const capturedTypes = events.map((e) => e.type || e.constructor.name);
60
+ return this.eventTypesNeeded.every((needed) => capturedTypes.includes(needed));
61
+ }
62
+ /**
63
+ * Capture an event and check if processing should trigger.
64
+ *
65
+ * @param event - The event to capture
66
+ */
67
+ captureEvent(event) {
68
+ const correlationId = event.correlationId;
69
+ if (!correlationId) {
70
+ return;
71
+ }
72
+ const events = this.results.get(correlationId) || [];
73
+ events.push(event);
74
+ this.results.set(correlationId, events);
75
+ // Notify waiters if we have all needed events
76
+ if (this.hasAllNeeded(correlationId)) {
77
+ const resolvers = this.waiters.get(correlationId) || [];
78
+ for (const resolve of resolvers) {
79
+ resolve(events);
80
+ }
81
+ this.waiters.delete(correlationId);
82
+ }
83
+ }
84
+ /**
85
+ * Get and clear the accumulated events for a correlation ID.
86
+ *
87
+ * @param correlationId - The correlation ID
88
+ * @returns Array of events
89
+ */
90
+ getAndResetResults(correlationId) {
91
+ const events = this.results.get(correlationId) || [];
92
+ this.results.delete(correlationId);
93
+ return events;
94
+ }
95
+ /**
96
+ * Wait for all required events to be received for a correlation ID.
97
+ *
98
+ * This method blocks until all events specified in `eventTypesNeeded` have
99
+ * been received with the given correlation ID, or until the timeout expires.
100
+ *
101
+ * @param correlationId - The correlation ID to wait for
102
+ * @param timeout - Optional timeout in milliseconds
103
+ * @returns Result containing the complete set of events or an error
104
+ */
105
+ async waitForEvents(correlationId, timeout) {
106
+ // Check if we already have all events
107
+ if (this.hasAllNeeded(correlationId)) {
108
+ return (0, error_1.Ok)(this.results.get(correlationId) || []);
109
+ }
110
+ // Create a promise that resolves when all events arrive
111
+ const promise = new Promise((resolve) => {
112
+ const resolvers = this.waiters.get(correlationId) || [];
113
+ resolvers.push(resolve);
114
+ this.waiters.set(correlationId, resolvers);
115
+ });
116
+ // Apply timeout if specified
117
+ if (timeout !== undefined) {
118
+ const timeoutPromise = new Promise((_, reject) => {
119
+ setTimeout(() => {
120
+ reject(new Error(`Timeout waiting for events (${timeout}ms)`));
121
+ }, timeout);
122
+ });
123
+ try {
124
+ const events = await Promise.race([promise, timeoutPromise]);
125
+ return (0, error_1.Ok)(events);
126
+ }
127
+ catch (error) {
128
+ return (0, error_1.Err)(error instanceof Error ? error : new Error(String(error)));
129
+ }
130
+ }
131
+ const events = await promise;
132
+ return (0, error_1.Ok)(events);
133
+ }
134
+ /**
135
+ * Receive and process an event.
136
+ *
137
+ * Events are accumulated until all required types are present, then
138
+ * `processEvents` is called with the complete set.
139
+ *
140
+ * @param event - The event to process
141
+ * @returns Result containing new events to dispatch or an error
142
+ */
143
+ async receiveEventAsync(event) {
144
+ const correlationId = event.correlationId;
145
+ if (!correlationId) {
146
+ return (0, error_1.Err)(new Error('Event missing correlation ID'));
147
+ }
148
+ // Capture the event
149
+ this.captureEvent(event);
150
+ // Check if we have all needed events
151
+ if (this.hasAllNeeded(correlationId)) {
152
+ const events = this.getAndResetResults(correlationId);
153
+ return this.processEvents(events);
154
+ }
155
+ // Not ready yet
156
+ return (0, error_1.Ok)([]);
157
+ }
158
+ }
159
+ exports.AsyncAggregatorAgent = AsyncAggregatorAgent;
160
+ //# sourceMappingURL=async-aggregator-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-aggregator-agent.js","sourceRoot":"","sources":["../../src/agents/async-aggregator-agent.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAIH,oCAA2C;AAO3C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAsB,oBAAoB;IACxC,mDAAmD;IACzC,OAAO,GAAyB,IAAI,GAAG,EAAE,CAAC;IAEpD,0DAA0D;IAClD,OAAO,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE1D,gEAAgE;IAC7C,gBAAgB,CAAW;IAE9C;;;;OAIG;IACH,YAAY,gBAA0B;QACpC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAAC,aAAqB;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAE,CAA+B,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CACnE,CAAC;QACF,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;;;OAIG;IACK,YAAY,CAAC,KAAY;QAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAExC,8CAA8C;QAC9C,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YACxD,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;gBAChC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,kBAAkB,CAAC,aAAqB;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,aAAa,CAAC,aAAqB,EAAE,OAAgB;QACzD,sCAAsC;QACtC,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,OAAO,IAAA,UAAE,EAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,wDAAwD;QACxD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YACxD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,IAAI,OAAO,CAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBACxD,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,OAAO,KAAK,CAAC,CAAC,CAAC;gBACjE,CAAC,EAAE,OAAO,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;gBAC7D,OAAO,IAAA,UAAE,EAAC,MAAM,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,IAAA,WAAG,EAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;QAC7B,OAAO,IAAA,UAAE,EAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAAY;QAClC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAA,WAAG,EAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,oBAAoB;QACpB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAEzB,qCAAqC;QACrC,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAED,gBAAgB;QAChB,OAAO,IAAA,UAAE,EAAC,EAAE,CAAC,CAAC;IAChB,CAAC;CAaF;AAxJD,oDAwJC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Async Dispatcher - Event processing loop for async agent systems
3
+ */
4
+ import { Event } from './event';
5
+ import { Router } from './router';
6
+ /**
7
+ * Asynchronous event dispatcher with background processing loop.
8
+ *
9
+ * The dispatcher maintains an event queue and continuously routes events
10
+ * to appropriate agents via a Router. Agents process events asynchronously
11
+ * and can produce new events to continue the workflow.
12
+ *
13
+ * The processing loop runs in the background and can be stopped gracefully.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const router = new Router();
18
+ * router.addRoute('QuestionEvent', factCheckerAgent);
19
+ * router.addRoute('QuestionEvent', answerGeneratorAgent);
20
+ *
21
+ * const dispatcher = new AsyncDispatcher(router);
22
+ * await dispatcher.start();
23
+ *
24
+ * dispatcher.dispatch(new QuestionEvent({ question: 'What is TypeScript?' }));
25
+ *
26
+ * await dispatcher.waitForEmptyQueue(5000);
27
+ * await dispatcher.stop();
28
+ * ```
29
+ */
30
+ export declare class AsyncDispatcher {
31
+ private readonly router;
32
+ private readonly eventQueue;
33
+ private stopFlag;
34
+ private processingLoop?;
35
+ private readonly batchSize;
36
+ /**
37
+ * Create a new async dispatcher.
38
+ *
39
+ * @param router - Router to use for directing events to agents
40
+ * @param batchSize - Number of events to process per iteration (default: 5)
41
+ */
42
+ constructor(router: Router, batchSize?: number);
43
+ /**
44
+ * Start the background event processing loop.
45
+ *
46
+ * The loop continues until `stop()` is called or a TerminateEvent is processed.
47
+ *
48
+ * @returns Promise that resolves when the loop starts
49
+ */
50
+ start(): Promise<AsyncDispatcher>;
51
+ /**
52
+ * Stop the background event processing loop.
53
+ *
54
+ * Waits for the current batch of events to finish processing before stopping.
55
+ *
56
+ * @returns Promise that resolves when processing has stopped
57
+ */
58
+ stop(): Promise<void>;
59
+ /**
60
+ * Add an event to the processing queue.
61
+ *
62
+ * If the event doesn't have a correlation ID, one will be assigned.
63
+ * Events are processed asynchronously by the background loop.
64
+ *
65
+ * @param event - The event to dispatch
66
+ */
67
+ dispatch(event: Event): void;
68
+ /**
69
+ * Wait for the event queue to become empty.
70
+ *
71
+ * Useful for ensuring all events have been processed before proceeding.
72
+ *
73
+ * @param timeout - Optional timeout in milliseconds
74
+ * @returns Promise resolving to true if queue emptied, false if timeout
75
+ */
76
+ waitForEmptyQueue(timeout?: number): Promise<boolean>;
77
+ /**
78
+ * Background event processing loop.
79
+ *
80
+ * Continuously processes events from the queue in batches, routing them
81
+ * through the router to appropriate agents. Runs until stopped or a
82
+ * TerminateEvent is encountered.
83
+ */
84
+ private dispatchEventsLoop;
85
+ /**
86
+ * Get the current number of events in the queue.
87
+ *
88
+ * @returns Number of queued events
89
+ */
90
+ getQueueLength(): number;
91
+ /**
92
+ * Check if the dispatcher is currently running.
93
+ *
94
+ * @returns True if the processing loop is active
95
+ */
96
+ isRunning(): boolean;
97
+ }
98
+ //# sourceMappingURL=async-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-dispatcher.d.ts","sourceRoot":"","sources":["../../src/agents/async-dispatcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAoB,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;OAKG;gBACS,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU;IAKjD;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAMvC;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAO5B;;;;;;;OAOG;IACG,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa3D;;;;;;OAMG;YACW,kBAAkB;IA4ChC;;;;OAIG;IACH,cAAc,IAAI,MAAM;IAIxB;;;;OAIG;IACH,SAAS,IAAI,OAAO;CAGrB"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ /**
3
+ * Async Dispatcher - Event processing loop for async agent systems
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AsyncDispatcher = void 0;
7
+ const event_1 = require("./event");
8
+ const error_1 = require("../error");
9
+ const crypto_1 = require("crypto");
10
+ /**
11
+ * Asynchronous event dispatcher with background processing loop.
12
+ *
13
+ * The dispatcher maintains an event queue and continuously routes events
14
+ * to appropriate agents via a Router. Agents process events asynchronously
15
+ * and can produce new events to continue the workflow.
16
+ *
17
+ * The processing loop runs in the background and can be stopped gracefully.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const router = new Router();
22
+ * router.addRoute('QuestionEvent', factCheckerAgent);
23
+ * router.addRoute('QuestionEvent', answerGeneratorAgent);
24
+ *
25
+ * const dispatcher = new AsyncDispatcher(router);
26
+ * await dispatcher.start();
27
+ *
28
+ * dispatcher.dispatch(new QuestionEvent({ question: 'What is TypeScript?' }));
29
+ *
30
+ * await dispatcher.waitForEmptyQueue(5000);
31
+ * await dispatcher.stop();
32
+ * ```
33
+ */
34
+ class AsyncDispatcher {
35
+ router;
36
+ eventQueue = [];
37
+ stopFlag = false;
38
+ processingLoop;
39
+ batchSize;
40
+ /**
41
+ * Create a new async dispatcher.
42
+ *
43
+ * @param router - Router to use for directing events to agents
44
+ * @param batchSize - Number of events to process per iteration (default: 5)
45
+ */
46
+ constructor(router, batchSize = 5) {
47
+ this.router = router;
48
+ this.batchSize = batchSize;
49
+ }
50
+ /**
51
+ * Start the background event processing loop.
52
+ *
53
+ * The loop continues until `stop()` is called or a TerminateEvent is processed.
54
+ *
55
+ * @returns Promise that resolves when the loop starts
56
+ */
57
+ async start() {
58
+ this.stopFlag = false;
59
+ this.processingLoop = this.dispatchEventsLoop();
60
+ return this;
61
+ }
62
+ /**
63
+ * Stop the background event processing loop.
64
+ *
65
+ * Waits for the current batch of events to finish processing before stopping.
66
+ *
67
+ * @returns Promise that resolves when processing has stopped
68
+ */
69
+ async stop() {
70
+ this.stopFlag = true;
71
+ if (this.processingLoop) {
72
+ await this.processingLoop;
73
+ this.processingLoop = undefined;
74
+ }
75
+ }
76
+ /**
77
+ * Add an event to the processing queue.
78
+ *
79
+ * If the event doesn't have a correlation ID, one will be assigned.
80
+ * Events are processed asynchronously by the background loop.
81
+ *
82
+ * @param event - The event to dispatch
83
+ */
84
+ dispatch(event) {
85
+ if (!event.correlationId) {
86
+ event.correlationId = (0, crypto_1.randomUUID)();
87
+ }
88
+ this.eventQueue.push(event);
89
+ }
90
+ /**
91
+ * Wait for the event queue to become empty.
92
+ *
93
+ * Useful for ensuring all events have been processed before proceeding.
94
+ *
95
+ * @param timeout - Optional timeout in milliseconds
96
+ * @returns Promise resolving to true if queue emptied, false if timeout
97
+ */
98
+ async waitForEmptyQueue(timeout) {
99
+ const startTime = Date.now();
100
+ while (this.eventQueue.length > 0) {
101
+ if (timeout !== undefined && Date.now() - startTime > timeout) {
102
+ return false;
103
+ }
104
+ await new Promise((resolve) => setTimeout(resolve, 100));
105
+ }
106
+ return true;
107
+ }
108
+ /**
109
+ * Background event processing loop.
110
+ *
111
+ * Continuously processes events from the queue in batches, routing them
112
+ * through the router to appropriate agents. Runs until stopped or a
113
+ * TerminateEvent is encountered.
114
+ */
115
+ async dispatchEventsLoop() {
116
+ while (!this.stopFlag) {
117
+ // Process up to batchSize events per iteration
118
+ for (let i = 0; i < this.batchSize && this.eventQueue.length > 0; i++) {
119
+ const event = this.eventQueue.shift();
120
+ if (!event) {
121
+ continue;
122
+ }
123
+ // Check for terminate event
124
+ if ((0, event_1.isTerminateEvent)(event)) {
125
+ this.stopFlag = true;
126
+ break;
127
+ }
128
+ // Route event to agents
129
+ const agents = this.router.getAgents(event);
130
+ // Process through each agent
131
+ for (const agent of agents) {
132
+ try {
133
+ const result = await agent.receiveEventAsync(event);
134
+ if ((0, error_1.isOk)(result)) {
135
+ // Dispatch any events produced by the agent
136
+ const events = result.value;
137
+ for (const newEvent of events) {
138
+ this.dispatch(newEvent);
139
+ }
140
+ }
141
+ else {
142
+ // Log error but continue processing
143
+ console.error(`Agent error processing event:`, result.error);
144
+ }
145
+ }
146
+ catch (error) {
147
+ console.error(`Unexpected error in agent:`, error);
148
+ }
149
+ }
150
+ }
151
+ // Small delay before next batch
152
+ await new Promise((resolve) => setTimeout(resolve, 100));
153
+ }
154
+ }
155
+ /**
156
+ * Get the current number of events in the queue.
157
+ *
158
+ * @returns Number of queued events
159
+ */
160
+ getQueueLength() {
161
+ return this.eventQueue.length;
162
+ }
163
+ /**
164
+ * Check if the dispatcher is currently running.
165
+ *
166
+ * @returns True if the processing loop is active
167
+ */
168
+ isRunning() {
169
+ return !this.stopFlag && this.processingLoop !== undefined;
170
+ }
171
+ }
172
+ exports.AsyncDispatcher = AsyncDispatcher;
173
+ //# sourceMappingURL=async-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-dispatcher.js","sourceRoot":"","sources":["../../src/agents/async-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Async LLM Agent with Memory - Base class for agents that use shared memory
3
+ */
4
+ import { AsyncLlmAgent, AsyncLlmAgentConfig } from './async-llm-agent';
5
+ import { SharedWorkingMemory } from '../context';
6
+ import { LlmMessage } from '../llm/models';
7
+ import { Result } from '../error';
8
+ /**
9
+ * Configuration for AsyncLlmAgentWithMemory
10
+ */
11
+ export interface AsyncLlmAgentWithMemoryConfig extends Omit<AsyncLlmAgentConfig, 'responseModel'> {
12
+ /** Shared working memory instance for reading and writing context */
13
+ memory: SharedWorkingMemory;
14
+ /** Instructions for the agent on how to process events and use memory */
15
+ instructions: string;
16
+ /** JSON schema for the agent's response (required for memory agents) */
17
+ responseModel: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Base class for async agents that use an LLM with shared working memory.
21
+ *
22
+ * This agent extends AsyncLlmAgent to add memory capabilities. The agent
23
+ * automatically includes current memory in its context and can update memory
24
+ * based on new information learned during processing.
25
+ *
26
+ * Memory is provided to the LLM in the system messages, and the LLM response
27
+ * includes a memory field that is merged back into the shared memory.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * interface QuestionResponse {
32
+ * answer: string;
33
+ * }
34
+ *
35
+ * class QuestionAgent extends AsyncLlmAgentWithMemory {
36
+ * constructor(broker: LlmBroker, memory: SharedWorkingMemory) {
37
+ * super({
38
+ * broker,
39
+ * memory,
40
+ * behaviour: 'You are a helpful assistant who remembers what you learn.',
41
+ * instructions: 'Answer questions using your memory and remember new facts.',
42
+ * responseModel: {
43
+ * type: 'object',
44
+ * properties: {
45
+ * answer: { type: 'string' }
46
+ * },
47
+ * required: ['answer']
48
+ * }
49
+ * });
50
+ * }
51
+ *
52
+ * async receiveEventAsync(event: Event): Promise<Result<Event[], Error>> {
53
+ * if (isQuestionEvent(event)) {
54
+ * const result = await this.generateResponseWithMemory<QuestionResponse>(
55
+ * event.question
56
+ * );
57
+ * if (isOk(result)) {
58
+ * return Ok([new AnswerEvent({ answer: result.value.answer })]);
59
+ * }
60
+ * }
61
+ * return Ok([]);
62
+ * }
63
+ * }
64
+ * ```
65
+ */
66
+ export declare abstract class AsyncLlmAgentWithMemory extends AsyncLlmAgent {
67
+ protected readonly memory: SharedWorkingMemory;
68
+ protected readonly instructions: string;
69
+ constructor(config: AsyncLlmAgentWithMemoryConfig);
70
+ /**
71
+ * Create the initial message set including memory context.
72
+ *
73
+ * This includes:
74
+ * 1. System message with behaviour
75
+ * 2. Memory context with current working memory
76
+ * 3. Instructions on how to use memory
77
+ *
78
+ * @returns Array of messages to send to the LLM
79
+ */
80
+ protected createInitialMessagesWithMemory(): LlmMessage[];
81
+ /**
82
+ * Generate a response from the LLM with memory context and update memory.
83
+ *
84
+ * This method:
85
+ * 1. Includes current memory in the context
86
+ * 2. Requests a response with updated memory
87
+ * 3. Merges new memory into shared memory
88
+ * 4. Returns the response without the memory field
89
+ *
90
+ * @param content - The user message content to send to the LLM
91
+ * @returns Result containing the LLM response or an error
92
+ */
93
+ protected generateResponseWithMemory<T>(content: string): Promise<Result<T, Error>>;
94
+ }
95
+ //# sourceMappingURL=async-llm-agent-with-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-llm-agent-with-memory.d.ts","sourceRoot":"","sources":["../../src/agents/async-llm-agent-with-memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAW,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,MAAM,EAAY,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC;IAC/F,qEAAqE;IACrE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,8BAAsB,uBAAwB,SAAQ,aAAa;IACjE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAE5B,MAAM,EAAE,6BAA6B;IAUjD;;;;;;;;;OASG;IACH,SAAS,CAAC,+BAA+B,IAAI,UAAU,EAAE;IAazD;;;;;;;;;;;OAWG;cACa,0BAA0B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;CA4C1F"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * Async LLM Agent with Memory - Base class for agents that use shared memory
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AsyncLlmAgentWithMemory = void 0;
7
+ const async_llm_agent_1 = require("./async-llm-agent");
8
+ const models_1 = require("../llm/models");
9
+ const error_1 = require("../error");
10
+ /**
11
+ * Base class for async agents that use an LLM with shared working memory.
12
+ *
13
+ * This agent extends AsyncLlmAgent to add memory capabilities. The agent
14
+ * automatically includes current memory in its context and can update memory
15
+ * based on new information learned during processing.
16
+ *
17
+ * Memory is provided to the LLM in the system messages, and the LLM response
18
+ * includes a memory field that is merged back into the shared memory.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * interface QuestionResponse {
23
+ * answer: string;
24
+ * }
25
+ *
26
+ * class QuestionAgent extends AsyncLlmAgentWithMemory {
27
+ * constructor(broker: LlmBroker, memory: SharedWorkingMemory) {
28
+ * super({
29
+ * broker,
30
+ * memory,
31
+ * behaviour: 'You are a helpful assistant who remembers what you learn.',
32
+ * instructions: 'Answer questions using your memory and remember new facts.',
33
+ * responseModel: {
34
+ * type: 'object',
35
+ * properties: {
36
+ * answer: { type: 'string' }
37
+ * },
38
+ * required: ['answer']
39
+ * }
40
+ * });
41
+ * }
42
+ *
43
+ * async receiveEventAsync(event: Event): Promise<Result<Event[], Error>> {
44
+ * if (isQuestionEvent(event)) {
45
+ * const result = await this.generateResponseWithMemory<QuestionResponse>(
46
+ * event.question
47
+ * );
48
+ * if (isOk(result)) {
49
+ * return Ok([new AnswerEvent({ answer: result.value.answer })]);
50
+ * }
51
+ * }
52
+ * return Ok([]);
53
+ * }
54
+ * }
55
+ * ```
56
+ */
57
+ class AsyncLlmAgentWithMemory extends async_llm_agent_1.AsyncLlmAgent {
58
+ memory;
59
+ instructions;
60
+ constructor(config) {
61
+ super({
62
+ ...config,
63
+ // Memory agents always need a response model for structured memory updates
64
+ responseModel: config.responseModel,
65
+ });
66
+ this.memory = config.memory;
67
+ this.instructions = config.instructions;
68
+ }
69
+ /**
70
+ * Create the initial message set including memory context.
71
+ *
72
+ * This includes:
73
+ * 1. System message with behaviour
74
+ * 2. Memory context with current working memory
75
+ * 3. Instructions on how to use memory
76
+ *
77
+ * @returns Array of messages to send to the LLM
78
+ */
79
+ createInitialMessagesWithMemory() {
80
+ const currentMemory = this.memory.getWorkingMemory();
81
+ return [
82
+ models_1.Message.system(this.behaviour),
83
+ models_1.Message.user(`This is what you remember:\n${JSON.stringify(currentMemory, null, 2)}\n\n` +
84
+ `Remember anything new you learn by storing it to your working memory in your response.`),
85
+ models_1.Message.user(this.instructions),
86
+ ];
87
+ }
88
+ /**
89
+ * Generate a response from the LLM with memory context and update memory.
90
+ *
91
+ * This method:
92
+ * 1. Includes current memory in the context
93
+ * 2. Requests a response with updated memory
94
+ * 3. Merges new memory into shared memory
95
+ * 4. Returns the response without the memory field
96
+ *
97
+ * @param content - The user message content to send to the LLM
98
+ * @returns Result containing the LLM response or an error
99
+ */
100
+ async generateResponseWithMemory(content) {
101
+ // Create augmented response model that includes memory field
102
+ const responseWithMemorySchema = {
103
+ type: 'object',
104
+ properties: {
105
+ ...this.responseModel?.properties,
106
+ memory: {
107
+ type: 'object',
108
+ description: 'Add anything new that you have learned here.',
109
+ default: this.memory.getWorkingMemory(),
110
+ },
111
+ },
112
+ required: [...(this.responseModel?.required || [])],
113
+ };
114
+ // Build messages with memory context
115
+ const messages = [
116
+ ...this.createInitialMessagesWithMemory(),
117
+ models_1.Message.user(content),
118
+ ];
119
+ // Generate structured response
120
+ const result = await this.broker.generateObject(messages, responseWithMemorySchema);
121
+ if ((0, error_1.isOk)(result)) {
122
+ const responseWithMemory = result.value;
123
+ // Extract and merge memory if present
124
+ if (responseWithMemory.memory) {
125
+ this.memory.mergeToWorkingMemory(responseWithMemory.memory);
126
+ }
127
+ // Remove memory field from response before returning
128
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
129
+ const { memory: _memory, ...responseWithoutMemory } = responseWithMemory;
130
+ return (0, error_1.Ok)(responseWithoutMemory);
131
+ }
132
+ return result;
133
+ }
134
+ }
135
+ exports.AsyncLlmAgentWithMemory = AsyncLlmAgentWithMemory;
136
+ //# sourceMappingURL=async-llm-agent-with-memory.js.map