@looopy-ai/core 1.0.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 (132) hide show
  1. package/LICENSE +9 -0
  2. package/dist/core/agent.d.ts +53 -0
  3. package/dist/core/agent.js +416 -0
  4. package/dist/core/cleanup.d.ts +12 -0
  5. package/dist/core/cleanup.js +45 -0
  6. package/dist/core/index.d.ts +3 -0
  7. package/dist/core/index.js +3 -0
  8. package/dist/core/iteration.d.ts +5 -0
  9. package/dist/core/iteration.js +60 -0
  10. package/dist/core/logger.d.ts +11 -0
  11. package/dist/core/logger.js +31 -0
  12. package/dist/core/loop.d.ts +5 -0
  13. package/dist/core/loop.js +125 -0
  14. package/dist/core/tools.d.ts +4 -0
  15. package/dist/core/tools.js +78 -0
  16. package/dist/core/types.d.ts +30 -0
  17. package/dist/core/types.js +1 -0
  18. package/dist/events/index.d.ts +3 -0
  19. package/dist/events/index.js +2 -0
  20. package/dist/events/utils.d.ts +250 -0
  21. package/dist/events/utils.js +263 -0
  22. package/dist/index.d.ts +8 -0
  23. package/dist/index.js +8 -0
  24. package/dist/observability/index.d.ts +1 -0
  25. package/dist/observability/index.js +1 -0
  26. package/dist/observability/spans/agent-turn.d.ts +31 -0
  27. package/dist/observability/spans/agent-turn.js +94 -0
  28. package/dist/observability/spans/index.d.ts +5 -0
  29. package/dist/observability/spans/index.js +5 -0
  30. package/dist/observability/spans/iteration.d.ts +14 -0
  31. package/dist/observability/spans/iteration.js +41 -0
  32. package/dist/observability/spans/llm-call.d.ts +14 -0
  33. package/dist/observability/spans/llm-call.js +50 -0
  34. package/dist/observability/spans/loop.d.ts +14 -0
  35. package/dist/observability/spans/loop.js +40 -0
  36. package/dist/observability/spans/tool.d.ts +14 -0
  37. package/dist/observability/spans/tool.js +44 -0
  38. package/dist/observability/tracing.d.ts +58 -0
  39. package/dist/observability/tracing.js +203 -0
  40. package/dist/providers/chat-completions/aggregate.d.ts +4 -0
  41. package/dist/providers/chat-completions/aggregate.js +152 -0
  42. package/dist/providers/chat-completions/content.d.ts +25 -0
  43. package/dist/providers/chat-completions/content.js +229 -0
  44. package/dist/providers/chat-completions/index.d.ts +4 -0
  45. package/dist/providers/chat-completions/index.js +4 -0
  46. package/dist/providers/chat-completions/streaming.d.ts +12 -0
  47. package/dist/providers/chat-completions/streaming.js +3 -0
  48. package/dist/providers/chat-completions/types.d.ts +39 -0
  49. package/dist/providers/chat-completions/types.js +1 -0
  50. package/dist/providers/index.d.ts +2 -0
  51. package/dist/providers/index.js +1 -0
  52. package/dist/providers/litellm-provider.d.ts +43 -0
  53. package/dist/providers/litellm-provider.js +377 -0
  54. package/dist/server/event-buffer.d.ts +37 -0
  55. package/dist/server/event-buffer.js +116 -0
  56. package/dist/server/event-router.d.ts +31 -0
  57. package/dist/server/event-router.js +91 -0
  58. package/dist/server/index.d.ts +3 -0
  59. package/dist/server/index.js +3 -0
  60. package/dist/server/sse.d.ts +60 -0
  61. package/dist/server/sse.js +159 -0
  62. package/dist/stores/artifacts/artifact-scheduler.d.ts +50 -0
  63. package/dist/stores/artifacts/artifact-scheduler.js +86 -0
  64. package/dist/stores/artifacts/index.d.ts +3 -0
  65. package/dist/stores/artifacts/index.js +3 -0
  66. package/dist/stores/artifacts/internal-event-artifact-store.d.ts +54 -0
  67. package/dist/stores/artifacts/internal-event-artifact-store.js +126 -0
  68. package/dist/stores/artifacts/memory-artifact-store.d.ts +52 -0
  69. package/dist/stores/artifacts/memory-artifact-store.js +268 -0
  70. package/dist/stores/filesystem/filesystem-agent-store.d.ts +18 -0
  71. package/dist/stores/filesystem/filesystem-agent-store.js +61 -0
  72. package/dist/stores/filesystem/filesystem-artifact-store.d.ts +59 -0
  73. package/dist/stores/filesystem/filesystem-artifact-store.js +325 -0
  74. package/dist/stores/filesystem/filesystem-context-store.d.ts +37 -0
  75. package/dist/stores/filesystem/filesystem-context-store.js +245 -0
  76. package/dist/stores/filesystem/filesystem-message-store.d.ts +28 -0
  77. package/dist/stores/filesystem/filesystem-message-store.js +149 -0
  78. package/dist/stores/filesystem/filesystem-task-state-store.d.ts +27 -0
  79. package/dist/stores/filesystem/filesystem-task-state-store.js +220 -0
  80. package/dist/stores/filesystem/index.d.ts +10 -0
  81. package/dist/stores/filesystem/index.js +5 -0
  82. package/dist/stores/index.d.ts +5 -0
  83. package/dist/stores/index.js +5 -0
  84. package/dist/stores/memory/memory-state-store.d.ts +15 -0
  85. package/dist/stores/memory/memory-state-store.js +55 -0
  86. package/dist/stores/messages/hybrid-message-store.d.ts +29 -0
  87. package/dist/stores/messages/hybrid-message-store.js +72 -0
  88. package/dist/stores/messages/index.d.ts +4 -0
  89. package/dist/stores/messages/index.js +4 -0
  90. package/dist/stores/messages/interfaces.d.ts +42 -0
  91. package/dist/stores/messages/interfaces.js +18 -0
  92. package/dist/stores/messages/mem0-message-store.d.ts +34 -0
  93. package/dist/stores/messages/mem0-message-store.js +218 -0
  94. package/dist/stores/messages/memory-message-store.d.ts +27 -0
  95. package/dist/stores/messages/memory-message-store.js +183 -0
  96. package/dist/tools/artifact-tools.d.ts +4 -0
  97. package/dist/tools/artifact-tools.js +277 -0
  98. package/dist/tools/client-tool-provider.d.ts +25 -0
  99. package/dist/tools/client-tool-provider.js +139 -0
  100. package/dist/tools/index.d.ts +4 -0
  101. package/dist/tools/index.js +4 -0
  102. package/dist/tools/local-tools.d.ts +13 -0
  103. package/dist/tools/local-tools.js +70 -0
  104. package/dist/tools/mcp-client.d.ts +29 -0
  105. package/dist/tools/mcp-client.js +62 -0
  106. package/dist/tools/mcp-tool-provider.d.ts +22 -0
  107. package/dist/tools/mcp-tool-provider.js +86 -0
  108. package/dist/types/a2a.d.ts +36 -0
  109. package/dist/types/a2a.js +1 -0
  110. package/dist/types/agent.d.ts +14 -0
  111. package/dist/types/agent.js +1 -0
  112. package/dist/types/artifact.d.ts +126 -0
  113. package/dist/types/artifact.js +1 -0
  114. package/dist/types/context.d.ts +13 -0
  115. package/dist/types/context.js +1 -0
  116. package/dist/types/event.d.ts +360 -0
  117. package/dist/types/event.js +30 -0
  118. package/dist/types/index.d.ts +9 -0
  119. package/dist/types/index.js +9 -0
  120. package/dist/types/llm.d.ts +24 -0
  121. package/dist/types/llm.js +1 -0
  122. package/dist/types/message.d.ts +9 -0
  123. package/dist/types/message.js +1 -0
  124. package/dist/types/state.d.ts +86 -0
  125. package/dist/types/state.js +1 -0
  126. package/dist/types/tools.d.ts +57 -0
  127. package/dist/types/tools.js +53 -0
  128. package/dist/utils/error.d.ts +8 -0
  129. package/dist/utils/error.js +23 -0
  130. package/dist/utils/process-signals.d.ts +3 -0
  131. package/dist/utils/process-signals.js +67 -0
  132. package/package.json +54 -0
@@ -0,0 +1,34 @@
1
+ import type { Message } from '../../types/message';
2
+ import type { CompactionOptions, CompactionResult, MessageStore } from './interfaces';
3
+ type MemoryClient = any;
4
+ export type Mem0MemoryLevel = 'conversation' | 'session' | 'user' | 'org';
5
+ export interface Mem0Config {
6
+ apiKey?: string;
7
+ memoryLevel?: Mem0MemoryLevel;
8
+ enableGraph?: boolean;
9
+ inferMemories?: boolean;
10
+ client?: MemoryClient;
11
+ orgId?: string;
12
+ }
13
+ export declare class Mem0MessageStore implements MessageStore {
14
+ private client;
15
+ private config;
16
+ private messageCache;
17
+ constructor(config: Mem0Config);
18
+ append(contextId: string, messages: Message[]): Promise<void>;
19
+ getRecent(contextId: string, options?: {
20
+ maxMessages?: number;
21
+ maxTokens?: number;
22
+ }): Promise<Message[]>;
23
+ private searchMemories;
24
+ private formatMemoriesAsContext;
25
+ getAll(contextId: string): Promise<Message[]>;
26
+ getCount(contextId: string): Promise<number>;
27
+ getRange(contextId: string, startIndex: number, endIndex: number): Promise<Message[]>;
28
+ compact(contextId: string, options?: CompactionOptions): Promise<CompactionResult>;
29
+ clear(contextId: string): Promise<void>;
30
+ private extractUserId;
31
+ updateMemory(memoryId: string, data: string): Promise<void>;
32
+ getAllMemories(contextId: string): Promise<unknown[]>;
33
+ }
34
+ export {};
@@ -0,0 +1,218 @@
1
+ import { estimateTokens, trimToTokenBudget } from './interfaces';
2
+ export class Mem0MessageStore {
3
+ client;
4
+ config;
5
+ messageCache = new Map();
6
+ constructor(config) {
7
+ this.config = {
8
+ apiKey: config.apiKey || '',
9
+ memoryLevel: config.memoryLevel || 'user',
10
+ enableGraph: config.enableGraph ?? true,
11
+ inferMemories: config.inferMemories ?? true,
12
+ client: config.client,
13
+ orgId: config.orgId || 'default-org',
14
+ };
15
+ if (config.client) {
16
+ this.client = config.client;
17
+ }
18
+ else {
19
+ try {
20
+ const { MemoryClient } = require('mem0ai');
21
+ this.client = new MemoryClient({ apiKey: this.config.apiKey });
22
+ }
23
+ catch {
24
+ throw new Error('Mem0 SDK not found. Install mem0ai package');
25
+ }
26
+ }
27
+ }
28
+ async append(contextId, messages) {
29
+ const cached = this.messageCache.get(contextId) || [];
30
+ const nextIndex = cached.length;
31
+ const storedMessages = messages.map((msg, i) => ({
32
+ ...msg,
33
+ id: `msg_${contextId}_${nextIndex + i}`,
34
+ contextId,
35
+ index: nextIndex + i,
36
+ timestamp: new Date().toISOString(),
37
+ tokens: estimateTokens(msg.content),
38
+ }));
39
+ this.messageCache.set(contextId, [...cached, ...storedMessages]);
40
+ try {
41
+ const mem0Messages = messages.map((msg) => ({
42
+ role: msg.role,
43
+ content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),
44
+ }));
45
+ const params = {
46
+ messages: mem0Messages,
47
+ infer: this.config.inferMemories,
48
+ metadata: {
49
+ contextId,
50
+ timestamp: new Date().toISOString(),
51
+ },
52
+ };
53
+ switch (this.config.memoryLevel) {
54
+ case 'conversation':
55
+ params.session_id = `conv_${contextId}`;
56
+ break;
57
+ case 'session':
58
+ params.session_id = contextId;
59
+ break;
60
+ case 'user':
61
+ params.user_id = this.extractUserId(contextId);
62
+ break;
63
+ case 'org':
64
+ params.org_id = this.config.orgId;
65
+ break;
66
+ }
67
+ if (this.config.enableGraph) {
68
+ params.enable_graph = true;
69
+ }
70
+ await this.client.add(params);
71
+ }
72
+ catch (error) {
73
+ console.error('Failed to add memories to Mem0:', error);
74
+ }
75
+ }
76
+ async getRecent(contextId, options) {
77
+ const cached = this.messageCache.get(contextId) || [];
78
+ const { maxMessages = 50, maxTokens } = options || {};
79
+ let messages = cached.slice(-maxMessages);
80
+ if (maxTokens) {
81
+ messages = trimToTokenBudget(messages, maxTokens);
82
+ }
83
+ try {
84
+ const memories = await this.searchMemories(contextId);
85
+ if (memories.length > 0) {
86
+ const memoryContext = {
87
+ role: 'system',
88
+ content: this.formatMemoriesAsContext(memories),
89
+ };
90
+ messages = [memoryContext, ...messages];
91
+ }
92
+ }
93
+ catch (error) {
94
+ console.error('Failed to search Mem0 memories:', error);
95
+ }
96
+ return messages;
97
+ }
98
+ async searchMemories(contextId, query) {
99
+ try {
100
+ const params = {
101
+ query: query || 'relevant context',
102
+ limit: 10,
103
+ filters: {
104
+ contextId,
105
+ },
106
+ };
107
+ switch (this.config.memoryLevel) {
108
+ case 'conversation':
109
+ params.session_id = `conv_${contextId}`;
110
+ break;
111
+ case 'session':
112
+ params.session_id = contextId;
113
+ break;
114
+ case 'user':
115
+ params.user_id = this.extractUserId(contextId);
116
+ break;
117
+ case 'org':
118
+ params.org_id = this.config.orgId;
119
+ break;
120
+ }
121
+ const response = await this.client.search(params);
122
+ return response.results || [];
123
+ }
124
+ catch (error) {
125
+ console.error('Failed to search Mem0 memories:', error);
126
+ return [];
127
+ }
128
+ }
129
+ formatMemoriesAsContext(memories) {
130
+ if (memories.length === 0)
131
+ return '';
132
+ const memoryLines = memories.map((m) => {
133
+ const record = m;
134
+ return `- ${String(record.memory || m)}`;
135
+ });
136
+ return `Relevant memories from previous conversations:\n${memoryLines.join('\n')}`;
137
+ }
138
+ async getAll(contextId) {
139
+ return this.messageCache.get(contextId) || [];
140
+ }
141
+ async getCount(contextId) {
142
+ const messages = this.messageCache.get(contextId) || [];
143
+ return messages.length;
144
+ }
145
+ async getRange(contextId, startIndex, endIndex) {
146
+ const all = this.messageCache.get(contextId) || [];
147
+ return all.slice(startIndex, endIndex);
148
+ }
149
+ async compact(contextId, options) {
150
+ const cached = this.messageCache.get(contextId) || [];
151
+ const keepRecent = options?.keepRecent || 50;
152
+ if (cached.length > keepRecent) {
153
+ const oldMessages = cached.slice(0, -keepRecent);
154
+ const recentMessages = cached.slice(-keepRecent);
155
+ this.messageCache.set(contextId, recentMessages);
156
+ return {
157
+ summaryMessages: [],
158
+ compactedRange: { start: 0, end: oldMessages.length },
159
+ tokensSaved: oldMessages.reduce((sum, m) => sum + (m.tokens || 0), 0),
160
+ };
161
+ }
162
+ return {
163
+ summaryMessages: [],
164
+ compactedRange: { start: 0, end: 0 },
165
+ tokensSaved: 0,
166
+ };
167
+ }
168
+ async clear(contextId) {
169
+ this.messageCache.delete(contextId);
170
+ try {
171
+ const memories = await this.searchMemories(contextId);
172
+ for (const memory of memories) {
173
+ const record = memory;
174
+ if (record.id) {
175
+ await this.client.delete(record.id);
176
+ }
177
+ }
178
+ }
179
+ catch (error) {
180
+ console.error('Failed to clear Mem0 memories:', error);
181
+ }
182
+ }
183
+ extractUserId(contextId) {
184
+ const parts = contextId.split('_');
185
+ return parts[0] || contextId;
186
+ }
187
+ async updateMemory(memoryId, data) {
188
+ try {
189
+ await this.client.update(memoryId, { data });
190
+ }
191
+ catch (error) {
192
+ console.error('Failed to update Mem0 memory:', error);
193
+ throw error;
194
+ }
195
+ }
196
+ async getAllMemories(contextId) {
197
+ try {
198
+ const params = {};
199
+ switch (this.config.memoryLevel) {
200
+ case 'user':
201
+ params.user_id = this.extractUserId(contextId);
202
+ break;
203
+ case 'session':
204
+ params.session_id = contextId;
205
+ break;
206
+ case 'org':
207
+ params.org_id = this.config.orgId;
208
+ break;
209
+ }
210
+ const response = await this.client.get_all(params);
211
+ return response.results || [];
212
+ }
213
+ catch (error) {
214
+ console.error('Failed to get all Mem0 memories:', error);
215
+ return [];
216
+ }
217
+ }
218
+ }
@@ -0,0 +1,27 @@
1
+ import type { LLMProvider } from '../../types/llm';
2
+ import type { Message } from '../../types/message';
3
+ import type { CompactionOptions, CompactionResult, MessageStore } from './interfaces';
4
+ export interface InMemoryMessageStoreConfig {
5
+ llmProvider?: LLMProvider;
6
+ defaultSummaryPrompt?: string;
7
+ }
8
+ export declare class InMemoryMessageStore implements MessageStore {
9
+ private messages;
10
+ private config;
11
+ constructor(config?: InMemoryMessageStoreConfig);
12
+ append(contextId: string, messages: Message[]): Promise<void>;
13
+ getRecent(contextId: string, options?: {
14
+ maxMessages?: number;
15
+ maxTokens?: number;
16
+ }): Promise<Message[]>;
17
+ getAll(contextId: string): Promise<Message[]>;
18
+ getCount(contextId: string): Promise<number>;
19
+ getRange(contextId: string, startIndex: number, endIndex: number): Promise<Message[]>;
20
+ compact(contextId: string, options?: CompactionOptions): Promise<CompactionResult>;
21
+ clear(contextId: string): Promise<void>;
22
+ private compactSlidingWindow;
23
+ private compactWithSummarization;
24
+ private compactHierarchical;
25
+ private createSummary;
26
+ private createLLMSummary;
27
+ }
@@ -0,0 +1,183 @@
1
+ import { filter, firstValueFrom } from 'rxjs';
2
+ import { estimateTokens, trimToTokenBudget } from './interfaces';
3
+ export class InMemoryMessageStore {
4
+ messages = new Map();
5
+ config;
6
+ constructor(config = {}) {
7
+ this.config = config;
8
+ }
9
+ async append(contextId, messages) {
10
+ const stored = this.messages.get(contextId) || [];
11
+ const nextIndex = stored.length;
12
+ const newMessages = messages.map((msg, i) => ({
13
+ ...msg,
14
+ id: `msg_${contextId}_${nextIndex + i}`,
15
+ contextId,
16
+ index: nextIndex + i,
17
+ timestamp: new Date().toISOString(),
18
+ tokens: estimateTokens(msg.content),
19
+ }));
20
+ this.messages.set(contextId, [...stored, ...newMessages]);
21
+ }
22
+ async getRecent(contextId, options) {
23
+ const all = this.messages.get(contextId) || [];
24
+ const { maxMessages = 50, maxTokens } = options || {};
25
+ let messages = all.slice(-maxMessages);
26
+ if (maxTokens) {
27
+ messages = trimToTokenBudget(messages, maxTokens);
28
+ }
29
+ return messages;
30
+ }
31
+ async getAll(contextId) {
32
+ return this.messages.get(contextId) || [];
33
+ }
34
+ async getCount(contextId) {
35
+ const messages = this.messages.get(contextId) || [];
36
+ return messages.length;
37
+ }
38
+ async getRange(contextId, startIndex, endIndex) {
39
+ const all = this.messages.get(contextId) || [];
40
+ return all.slice(startIndex, endIndex);
41
+ }
42
+ async compact(contextId, options) {
43
+ const all = this.messages.get(contextId) || [];
44
+ const keepRecent = options?.keepRecent || 50;
45
+ if (all.length <= keepRecent) {
46
+ return {
47
+ summaryMessages: [],
48
+ compactedRange: { start: 0, end: 0 },
49
+ tokensSaved: 0,
50
+ };
51
+ }
52
+ const strategy = options?.strategy || 'sliding-window';
53
+ switch (strategy) {
54
+ case 'sliding-window':
55
+ return this.compactSlidingWindow(contextId, keepRecent);
56
+ case 'summarization':
57
+ return this.compactWithSummarization(contextId, keepRecent, options?.summaryPrompt);
58
+ case 'hierarchical':
59
+ return this.compactHierarchical(contextId, keepRecent);
60
+ default:
61
+ throw new Error(`Unknown compaction strategy: ${strategy}`);
62
+ }
63
+ }
64
+ async clear(contextId) {
65
+ this.messages.delete(contextId);
66
+ }
67
+ async compactSlidingWindow(contextId, keepRecent) {
68
+ const all = this.messages.get(contextId) || [];
69
+ const oldMessages = all.slice(0, -keepRecent);
70
+ const recentMessages = all.slice(-keepRecent);
71
+ const tokensSaved = oldMessages.reduce((sum, m) => sum + (m.tokens || 0), 0);
72
+ this.messages.set(contextId, recentMessages);
73
+ return {
74
+ summaryMessages: [],
75
+ compactedRange: { start: 0, end: oldMessages.length },
76
+ tokensSaved,
77
+ };
78
+ }
79
+ async compactWithSummarization(contextId, keepRecent, summaryPrompt) {
80
+ const all = this.messages.get(contextId) || [];
81
+ const oldMessages = all.slice(0, -keepRecent);
82
+ const recentMessages = all.slice(-keepRecent);
83
+ const summaryContent = await this.createSummary(oldMessages, summaryPrompt);
84
+ const summary = {
85
+ role: 'system',
86
+ content: summaryContent,
87
+ };
88
+ const summaryStored = {
89
+ ...summary,
90
+ id: `summary_${contextId}_${Date.now()}`,
91
+ contextId,
92
+ index: 0,
93
+ timestamp: new Date().toISOString(),
94
+ tokens: estimateTokens(summary.content),
95
+ compacted: true,
96
+ summarizedRange: { start: 0, end: oldMessages.length },
97
+ };
98
+ const tokensSaved = oldMessages.reduce((sum, m) => sum + (m.tokens || 0), 0) - (summaryStored.tokens || 0);
99
+ this.messages.set(contextId, [summaryStored, ...recentMessages]);
100
+ return {
101
+ summaryMessages: [summary],
102
+ compactedRange: { start: 0, end: oldMessages.length },
103
+ tokensSaved,
104
+ };
105
+ }
106
+ async compactHierarchical(contextId, keepRecent) {
107
+ const all = this.messages.get(contextId) || [];
108
+ const oldMessages = all.slice(0, -keepRecent);
109
+ const recentMessages = all.slice(-keepRecent);
110
+ const summaries = [];
111
+ let tokensSaved = 0;
112
+ for (let i = 0; i < oldMessages.length; i += 10) {
113
+ const chunk = oldMessages.slice(i, Math.min(i + 10, oldMessages.length));
114
+ const summaryContent = await this.createSummary(chunk);
115
+ const summary = {
116
+ role: 'system',
117
+ content: summaryContent,
118
+ };
119
+ const summaryStored = {
120
+ ...summary,
121
+ id: `summary_${contextId}_${i}`,
122
+ contextId,
123
+ index: i,
124
+ timestamp: new Date().toISOString(),
125
+ tokens: estimateTokens(summary.content),
126
+ compacted: true,
127
+ summarizedRange: { start: i, end: i + chunk.length },
128
+ };
129
+ summaries.push(summaryStored);
130
+ tokensSaved +=
131
+ chunk.reduce((sum, m) => sum + (m.tokens || 0), 0) - (summaryStored.tokens || 0);
132
+ }
133
+ this.messages.set(contextId, [...summaries, ...recentMessages]);
134
+ return {
135
+ summaryMessages: summaries,
136
+ compactedRange: { start: 0, end: oldMessages.length },
137
+ tokensSaved,
138
+ };
139
+ }
140
+ async createSummary(messages, customPrompt) {
141
+ if (this.config.llmProvider) {
142
+ try {
143
+ return await this.createLLMSummary(messages, customPrompt);
144
+ }
145
+ catch (error) {
146
+ console.warn('LLM summarization failed, falling back to rule-based:', error);
147
+ }
148
+ }
149
+ if (customPrompt) {
150
+ return `${customPrompt}\n\nMessages:\n${messages.map((m) => `${m.role}: ${m.content}`).join('\n')}`;
151
+ }
152
+ const userMessages = messages.filter((m) => m.role === 'user');
153
+ const assistantMessages = messages.filter((m) => m.role === 'assistant');
154
+ return `Summary of ${messages.length} messages: ${userMessages.length} user messages, ${assistantMessages.length} assistant responses.`;
155
+ }
156
+ async createLLMSummary(messages, customPrompt) {
157
+ if (!this.config.llmProvider) {
158
+ throw new Error('LLM Provider not configured for summarization');
159
+ }
160
+ const summaryPrompt = customPrompt ||
161
+ this.config.defaultSummaryPrompt ||
162
+ 'Please provide a concise summary of the following conversation, capturing the key points and context:';
163
+ const conversationText = messages
164
+ .filter((m) => ['user', 'assistant'].includes(m.role))
165
+ .map((m) => `${m.role.toUpperCase()}: ${m.content}`)
166
+ .join('\n');
167
+ const summaryMessages = [
168
+ {
169
+ role: 'user',
170
+ content: `${summaryPrompt}\n\n${conversationText}`,
171
+ },
172
+ ];
173
+ const response$ = this.config.llmProvider.call({
174
+ messages: summaryMessages,
175
+ stream: false,
176
+ });
177
+ const completeEvent = await firstValueFrom(response$.pipe(filter((event) => event.kind === 'content-complete')));
178
+ if (completeEvent.content) {
179
+ return completeEvent.content;
180
+ }
181
+ throw new Error('Failed to get summary from LLM');
182
+ }
183
+ }
@@ -0,0 +1,4 @@
1
+ import type { ArtifactStore } from '../types/artifact';
2
+ import type { TaskStateStore } from '../types/state';
3
+ import type { ToolProvider } from '../types/tools';
4
+ export declare function createArtifactTools(artifactStore: ArtifactStore, taskStateStore: TaskStateStore): ToolProvider;