@mtkn/mega-agent 0.1.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 (295) hide show
  1. package/dist/artifact/artifact.repository.d.ts +17 -0
  2. package/dist/artifact/artifact.repository.d.ts.map +1 -0
  3. package/dist/artifact/artifact.repository.js +66 -0
  4. package/dist/artifact/artifact.repository.js.map +1 -0
  5. package/dist/artifact/artifact.service.d.ts +22 -0
  6. package/dist/artifact/artifact.service.d.ts.map +1 -0
  7. package/dist/artifact/artifact.service.js +87 -0
  8. package/dist/artifact/artifact.service.js.map +1 -0
  9. package/dist/artifact/artifact.types.d.ts +41 -0
  10. package/dist/artifact/artifact.types.d.ts.map +1 -0
  11. package/dist/artifact/artifact.types.js +6 -0
  12. package/dist/artifact/artifact.types.js.map +1 -0
  13. package/dist/artifact/index.d.ts +6 -0
  14. package/dist/artifact/index.d.ts.map +1 -0
  15. package/dist/artifact/index.js +4 -0
  16. package/dist/artifact/index.js.map +1 -0
  17. package/dist/chat/chat-memory.integration.d.ts +59 -0
  18. package/dist/chat/chat-memory.integration.d.ts.map +1 -0
  19. package/dist/chat/chat-memory.integration.js +148 -0
  20. package/dist/chat/chat-memory.integration.js.map +1 -0
  21. package/dist/chat/chat.repository.d.ts +58 -0
  22. package/dist/chat/chat.repository.d.ts.map +1 -0
  23. package/dist/chat/chat.repository.js +128 -0
  24. package/dist/chat/chat.repository.js.map +1 -0
  25. package/dist/chat/chat.service.d.ts +28 -0
  26. package/dist/chat/chat.service.d.ts.map +1 -0
  27. package/dist/chat/chat.service.js +217 -0
  28. package/dist/chat/chat.service.js.map +1 -0
  29. package/dist/chat/chat.types.d.ts +198 -0
  30. package/dist/chat/chat.types.d.ts.map +1 -0
  31. package/dist/chat/chat.types.js +8 -0
  32. package/dist/chat/chat.types.js.map +1 -0
  33. package/dist/chat/index.d.ts +17 -0
  34. package/dist/chat/index.d.ts.map +1 -0
  35. package/dist/chat/index.js +16 -0
  36. package/dist/chat/index.js.map +1 -0
  37. package/dist/chat/memory-detector.d.ts +53 -0
  38. package/dist/chat/memory-detector.d.ts.map +1 -0
  39. package/dist/chat/memory-detector.js +172 -0
  40. package/dist/chat/memory-detector.js.map +1 -0
  41. package/dist/chat/prompts/index.d.ts +6 -0
  42. package/dist/chat/prompts/index.d.ts.map +1 -0
  43. package/dist/chat/prompts/index.js +6 -0
  44. package/dist/chat/prompts/index.js.map +1 -0
  45. package/dist/chat/prompts/system.prompts.d.ts +23 -0
  46. package/dist/chat/prompts/system.prompts.d.ts.map +1 -0
  47. package/dist/chat/prompts/system.prompts.js +102 -0
  48. package/dist/chat/prompts/system.prompts.js.map +1 -0
  49. package/dist/chat/response-parser.d.ts +24 -0
  50. package/dist/chat/response-parser.d.ts.map +1 -0
  51. package/dist/chat/response-parser.js +198 -0
  52. package/dist/chat/response-parser.js.map +1 -0
  53. package/dist/chat/response.types.d.ts +90 -0
  54. package/dist/chat/response.types.d.ts.map +1 -0
  55. package/dist/chat/response.types.js +6 -0
  56. package/dist/chat/response.types.js.map +1 -0
  57. package/dist/common/errors.d.ts +60 -0
  58. package/dist/common/errors.d.ts.map +1 -0
  59. package/dist/common/errors.js +105 -0
  60. package/dist/common/errors.js.map +1 -0
  61. package/dist/common/index.d.ts +3 -0
  62. package/dist/common/index.d.ts.map +1 -0
  63. package/dist/common/index.js +3 -0
  64. package/dist/common/index.js.map +1 -0
  65. package/dist/common/retry.d.ts +23 -0
  66. package/dist/common/retry.d.ts.map +1 -0
  67. package/dist/common/retry.js +57 -0
  68. package/dist/common/retry.js.map +1 -0
  69. package/dist/create-mega-agent.d.ts +100 -0
  70. package/dist/create-mega-agent.d.ts.map +1 -0
  71. package/dist/create-mega-agent.js +153 -0
  72. package/dist/create-mega-agent.js.map +1 -0
  73. package/dist/embedding/embedding.service.d.ts +34 -0
  74. package/dist/embedding/embedding.service.d.ts.map +1 -0
  75. package/dist/embedding/embedding.service.js +68 -0
  76. package/dist/embedding/embedding.service.js.map +1 -0
  77. package/dist/embedding/embedding.types.d.ts +38 -0
  78. package/dist/embedding/embedding.types.d.ts.map +1 -0
  79. package/dist/embedding/embedding.types.js +6 -0
  80. package/dist/embedding/embedding.types.js.map +1 -0
  81. package/dist/embedding/index.d.ts +9 -0
  82. package/dist/embedding/index.d.ts.map +1 -0
  83. package/dist/embedding/index.js +9 -0
  84. package/dist/embedding/index.js.map +1 -0
  85. package/dist/embedding/providers/base.provider.d.ts +29 -0
  86. package/dist/embedding/providers/base.provider.d.ts.map +1 -0
  87. package/dist/embedding/providers/base.provider.js +19 -0
  88. package/dist/embedding/providers/base.provider.js.map +1 -0
  89. package/dist/embedding/providers/index.d.ts +7 -0
  90. package/dist/embedding/providers/index.d.ts.map +1 -0
  91. package/dist/embedding/providers/index.js +7 -0
  92. package/dist/embedding/providers/index.js.map +1 -0
  93. package/dist/embedding/providers/openai.provider.d.ts +17 -0
  94. package/dist/embedding/providers/openai.provider.d.ts.map +1 -0
  95. package/dist/embedding/providers/openai.provider.js +73 -0
  96. package/dist/embedding/providers/openai.provider.js.map +1 -0
  97. package/dist/http/chat.controller.d.ts +30 -0
  98. package/dist/http/chat.controller.d.ts.map +1 -0
  99. package/dist/http/chat.controller.js +163 -0
  100. package/dist/http/chat.controller.js.map +1 -0
  101. package/dist/http/chat.routes.d.ts +5 -0
  102. package/dist/http/chat.routes.d.ts.map +1 -0
  103. package/dist/http/chat.routes.js +38 -0
  104. package/dist/http/chat.routes.js.map +1 -0
  105. package/dist/http/chat.validation.d.ts +70 -0
  106. package/dist/http/chat.validation.d.ts.map +1 -0
  107. package/dist/http/chat.validation.js +28 -0
  108. package/dist/http/chat.validation.js.map +1 -0
  109. package/dist/incident/incident.correlator.d.ts +39 -0
  110. package/dist/incident/incident.correlator.d.ts.map +1 -0
  111. package/dist/incident/incident.correlator.js +129 -0
  112. package/dist/incident/incident.correlator.js.map +1 -0
  113. package/dist/incident/incident.detector.d.ts +62 -0
  114. package/dist/incident/incident.detector.d.ts.map +1 -0
  115. package/dist/incident/incident.detector.js +192 -0
  116. package/dist/incident/incident.detector.js.map +1 -0
  117. package/dist/incident/incident.repository.d.ts +79 -0
  118. package/dist/incident/incident.repository.d.ts.map +1 -0
  119. package/dist/incident/incident.repository.js +216 -0
  120. package/dist/incident/incident.repository.js.map +1 -0
  121. package/dist/incident/incident.service.d.ts +71 -0
  122. package/dist/incident/incident.service.d.ts.map +1 -0
  123. package/dist/incident/incident.service.js +217 -0
  124. package/dist/incident/incident.service.js.map +1 -0
  125. package/dist/incident/incident.types.d.ts +115 -0
  126. package/dist/incident/incident.types.d.ts.map +1 -0
  127. package/dist/incident/incident.types.js +6 -0
  128. package/dist/incident/incident.types.js.map +1 -0
  129. package/dist/incident/index.d.ts +13 -0
  130. package/dist/incident/index.d.ts.map +1 -0
  131. package/dist/incident/index.js +13 -0
  132. package/dist/incident/index.js.map +1 -0
  133. package/dist/index.d.ts +26 -0
  134. package/dist/index.d.ts.map +1 -0
  135. package/dist/index.js +26 -0
  136. package/dist/index.js.map +1 -0
  137. package/dist/llm/index.d.ts +8 -0
  138. package/dist/llm/index.d.ts.map +1 -0
  139. package/dist/llm/index.js +9 -0
  140. package/dist/llm/index.js.map +1 -0
  141. package/dist/llm/llm.service.d.ts +52 -0
  142. package/dist/llm/llm.service.d.ts.map +1 -0
  143. package/dist/llm/llm.service.js +141 -0
  144. package/dist/llm/llm.service.js.map +1 -0
  145. package/dist/llm/llm.types.d.ts +77 -0
  146. package/dist/llm/llm.types.d.ts.map +1 -0
  147. package/dist/llm/llm.types.js +5 -0
  148. package/dist/llm/llm.types.js.map +1 -0
  149. package/dist/llm/providers/anthropic.provider.d.ts +16 -0
  150. package/dist/llm/providers/anthropic.provider.d.ts.map +1 -0
  151. package/dist/llm/providers/anthropic.provider.js +118 -0
  152. package/dist/llm/providers/anthropic.provider.js.map +1 -0
  153. package/dist/llm/providers/base.provider.d.ts +17 -0
  154. package/dist/llm/providers/base.provider.d.ts.map +1 -0
  155. package/dist/llm/providers/base.provider.js +18 -0
  156. package/dist/llm/providers/base.provider.js.map +1 -0
  157. package/dist/llm/providers/custom.provider.d.ts +15 -0
  158. package/dist/llm/providers/custom.provider.d.ts.map +1 -0
  159. package/dist/llm/providers/custom.provider.js +110 -0
  160. package/dist/llm/providers/custom.provider.js.map +1 -0
  161. package/dist/llm/providers/gemini.provider.d.ts +19 -0
  162. package/dist/llm/providers/gemini.provider.d.ts.map +1 -0
  163. package/dist/llm/providers/gemini.provider.js +98 -0
  164. package/dist/llm/providers/gemini.provider.js.map +1 -0
  165. package/dist/llm/providers/index.d.ts +10 -0
  166. package/dist/llm/providers/index.d.ts.map +1 -0
  167. package/dist/llm/providers/index.js +10 -0
  168. package/dist/llm/providers/index.js.map +1 -0
  169. package/dist/llm/providers/openai.provider.d.ts +15 -0
  170. package/dist/llm/providers/openai.provider.d.ts.map +1 -0
  171. package/dist/llm/providers/openai.provider.js +57 -0
  172. package/dist/llm/providers/openai.provider.js.map +1 -0
  173. package/dist/mcp/index.d.ts +13 -0
  174. package/dist/mcp/index.d.ts.map +1 -0
  175. package/dist/mcp/index.js +17 -0
  176. package/dist/mcp/index.js.map +1 -0
  177. package/dist/mcp/mcp.client.d.ts +57 -0
  178. package/dist/mcp/mcp.client.d.ts.map +1 -0
  179. package/dist/mcp/mcp.client.js +150 -0
  180. package/dist/mcp/mcp.client.js.map +1 -0
  181. package/dist/mcp/mcp.service.d.ts +64 -0
  182. package/dist/mcp/mcp.service.d.ts.map +1 -0
  183. package/dist/mcp/mcp.service.js +207 -0
  184. package/dist/mcp/mcp.service.js.map +1 -0
  185. package/dist/mcp/mcp.types.d.ts +142 -0
  186. package/dist/mcp/mcp.types.d.ts.map +1 -0
  187. package/dist/mcp/mcp.types.js +6 -0
  188. package/dist/mcp/mcp.types.js.map +1 -0
  189. package/dist/mcp/presets/common-sources.d.ts +28 -0
  190. package/dist/mcp/presets/common-sources.d.ts.map +1 -0
  191. package/dist/mcp/presets/common-sources.js +114 -0
  192. package/dist/mcp/presets/common-sources.js.map +1 -0
  193. package/dist/mcp/presets/index.d.ts +5 -0
  194. package/dist/mcp/presets/index.d.ts.map +1 -0
  195. package/dist/mcp/presets/index.js +5 -0
  196. package/dist/mcp/presets/index.js.map +1 -0
  197. package/dist/mcp/source.repository.d.ts +68 -0
  198. package/dist/mcp/source.repository.d.ts.map +1 -0
  199. package/dist/mcp/source.repository.js +114 -0
  200. package/dist/mcp/source.repository.js.map +1 -0
  201. package/dist/mcp/source.service.d.ts +74 -0
  202. package/dist/mcp/source.service.d.ts.map +1 -0
  203. package/dist/mcp/source.service.js +181 -0
  204. package/dist/mcp/source.service.js.map +1 -0
  205. package/dist/mcp/transports/http.transport.d.ts +45 -0
  206. package/dist/mcp/transports/http.transport.d.ts.map +1 -0
  207. package/dist/mcp/transports/http.transport.js +64 -0
  208. package/dist/mcp/transports/http.transport.js.map +1 -0
  209. package/dist/mcp/transports/index.d.ts +7 -0
  210. package/dist/mcp/transports/index.d.ts.map +1 -0
  211. package/dist/mcp/transports/index.js +7 -0
  212. package/dist/mcp/transports/index.js.map +1 -0
  213. package/dist/mcp/transports/stdio.transport.d.ts +21 -0
  214. package/dist/mcp/transports/stdio.transport.d.ts.map +1 -0
  215. package/dist/mcp/transports/stdio.transport.js +29 -0
  216. package/dist/mcp/transports/stdio.transport.js.map +1 -0
  217. package/dist/memory/index.d.ts +10 -0
  218. package/dist/memory/index.d.ts.map +1 -0
  219. package/dist/memory/index.js +10 -0
  220. package/dist/memory/index.js.map +1 -0
  221. package/dist/memory/memory.repository.d.ts +62 -0
  222. package/dist/memory/memory.repository.d.ts.map +1 -0
  223. package/dist/memory/memory.repository.js +148 -0
  224. package/dist/memory/memory.repository.js.map +1 -0
  225. package/dist/memory/memory.service.d.ts +63 -0
  226. package/dist/memory/memory.service.d.ts.map +1 -0
  227. package/dist/memory/memory.service.js +263 -0
  228. package/dist/memory/memory.service.js.map +1 -0
  229. package/dist/memory/memory.types.d.ts +104 -0
  230. package/dist/memory/memory.types.d.ts.map +1 -0
  231. package/dist/memory/memory.types.js +8 -0
  232. package/dist/memory/memory.types.js.map +1 -0
  233. package/dist/qdrant/index.d.ts +8 -0
  234. package/dist/qdrant/index.d.ts.map +1 -0
  235. package/dist/qdrant/index.js +6 -0
  236. package/dist/qdrant/index.js.map +1 -0
  237. package/dist/qdrant/qdrant.service.d.ts +63 -0
  238. package/dist/qdrant/qdrant.service.d.ts.map +1 -0
  239. package/dist/qdrant/qdrant.service.js +201 -0
  240. package/dist/qdrant/qdrant.service.js.map +1 -0
  241. package/dist/qdrant/qdrant.types.d.ts +55 -0
  242. package/dist/qdrant/qdrant.types.d.ts.map +1 -0
  243. package/dist/qdrant/qdrant.types.js +6 -0
  244. package/dist/qdrant/qdrant.types.js.map +1 -0
  245. package/dist/tools/core-tools.d.ts +7 -0
  246. package/dist/tools/core-tools.d.ts.map +1 -0
  247. package/dist/tools/core-tools.js +52 -0
  248. package/dist/tools/core-tools.js.map +1 -0
  249. package/dist/tools/index.d.ts +4 -0
  250. package/dist/tools/index.d.ts.map +1 -0
  251. package/dist/tools/index.js +3 -0
  252. package/dist/tools/index.js.map +1 -0
  253. package/dist/tools/tool-registry.d.ts +51 -0
  254. package/dist/tools/tool-registry.d.ts.map +1 -0
  255. package/dist/tools/tool-registry.js +50 -0
  256. package/dist/tools/tool-registry.js.map +1 -0
  257. package/dist/workflow/actions/base.action.d.ts +50 -0
  258. package/dist/workflow/actions/base.action.d.ts.map +1 -0
  259. package/dist/workflow/actions/base.action.js +59 -0
  260. package/dist/workflow/actions/base.action.js.map +1 -0
  261. package/dist/workflow/actions/incident.action.d.ts +13 -0
  262. package/dist/workflow/actions/incident.action.d.ts.map +1 -0
  263. package/dist/workflow/actions/incident.action.js +70 -0
  264. package/dist/workflow/actions/incident.action.js.map +1 -0
  265. package/dist/workflow/actions/index.d.ts +9 -0
  266. package/dist/workflow/actions/index.d.ts.map +1 -0
  267. package/dist/workflow/actions/index.js +11 -0
  268. package/dist/workflow/actions/index.js.map +1 -0
  269. package/dist/workflow/actions/notify.action.d.ts +18 -0
  270. package/dist/workflow/actions/notify.action.d.ts.map +1 -0
  271. package/dist/workflow/actions/notify.action.js +106 -0
  272. package/dist/workflow/actions/notify.action.js.map +1 -0
  273. package/dist/workflow/actions/report.action.d.ts +13 -0
  274. package/dist/workflow/actions/report.action.d.ts.map +1 -0
  275. package/dist/workflow/actions/report.action.js +64 -0
  276. package/dist/workflow/actions/report.action.js.map +1 -0
  277. package/dist/workflow/index.d.ts +10 -0
  278. package/dist/workflow/index.d.ts.map +1 -0
  279. package/dist/workflow/index.js +11 -0
  280. package/dist/workflow/index.js.map +1 -0
  281. package/dist/workflow/workflow.repository.d.ts +90 -0
  282. package/dist/workflow/workflow.repository.d.ts.map +1 -0
  283. package/dist/workflow/workflow.repository.js +238 -0
  284. package/dist/workflow/workflow.repository.js.map +1 -0
  285. package/dist/workflow/workflow.service.d.ts +98 -0
  286. package/dist/workflow/workflow.service.d.ts.map +1 -0
  287. package/dist/workflow/workflow.service.js +374 -0
  288. package/dist/workflow/workflow.service.js.map +1 -0
  289. package/dist/workflow/workflow.types.d.ts +146 -0
  290. package/dist/workflow/workflow.types.d.ts.map +1 -0
  291. package/dist/workflow/workflow.types.js +8 -0
  292. package/dist/workflow/workflow.types.js.map +1 -0
  293. package/package.json +67 -0
  294. package/prisma/schema.prisma +551 -0
  295. package/scripts/prisma-sync.mjs +187 -0
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Chat Repository
3
+ * Data access layer for chat operations
4
+ */
5
+ let _deps = null;
6
+ /**
7
+ * Initialize the Chat repository with dependencies
8
+ */
9
+ export function initChatRepository(deps) {
10
+ _deps = deps;
11
+ }
12
+ export class ChatRepository {
13
+ get prisma() {
14
+ if (!_deps)
15
+ throw new Error('[ChatRepository] Not initialized');
16
+ return _deps.prisma;
17
+ }
18
+ get logger() {
19
+ if (!_deps)
20
+ throw new Error('[ChatRepository] Not initialized');
21
+ return _deps.logger;
22
+ }
23
+ /**
24
+ * Create a new chat
25
+ */
26
+ async createChat(data) {
27
+ const chat = await this.prisma.aiChat.create({
28
+ data: {
29
+ userId: data.userId,
30
+ title: data.title,
31
+ mode: data.mode || 'EXPLORE',
32
+ model: data.model || process.env.ANTHROPIC_DEFAULT_MODEL || 'claude-opus-4-6',
33
+ temperature: data.temperature ?? 0.7,
34
+ systemPrompt: data.systemPrompt,
35
+ },
36
+ });
37
+ this.logger.debug('Chat created', { id: chat.id });
38
+ return chat;
39
+ }
40
+ /**
41
+ * Find chat by ID
42
+ */
43
+ async findById(id) {
44
+ return this.prisma.aiChat.findUnique({ where: { id } });
45
+ }
46
+ /**
47
+ * Find chat by ID with messages
48
+ */
49
+ async findByIdWithMessages(id, messageLimit) {
50
+ return this.prisma.aiChat.findUnique({
51
+ where: { id },
52
+ include: {
53
+ messages: {
54
+ orderBy: { createdAt: 'asc' },
55
+ take: messageLimit,
56
+ },
57
+ },
58
+ });
59
+ }
60
+ /**
61
+ * Find chats by user
62
+ */
63
+ async findByUser(userId, limit) {
64
+ return this.prisma.aiChat.findMany({
65
+ where: { userId },
66
+ orderBy: { updatedAt: 'desc' },
67
+ take: limit,
68
+ });
69
+ }
70
+ /**
71
+ * Update a chat
72
+ */
73
+ async updateChat(id, data) {
74
+ return this.prisma.aiChat.update({
75
+ where: { id },
76
+ data,
77
+ });
78
+ }
79
+ /**
80
+ * Delete a chat
81
+ */
82
+ async deleteChat(id) {
83
+ await this.prisma.aiChat.delete({ where: { id } });
84
+ this.logger.debug('Chat deleted', { id });
85
+ }
86
+ /**
87
+ * Add a message to a chat
88
+ */
89
+ async addMessage(chatId, role, content, metadata) {
90
+ const message = await this.prisma.aiChatMessage.create({
91
+ data: {
92
+ chatId,
93
+ role,
94
+ content,
95
+ model: metadata?.model,
96
+ tokens: metadata?.tokens,
97
+ latencyMs: metadata?.latencyMs,
98
+ usedMemoryIds: metadata?.usedMemoryIds ?? [],
99
+ },
100
+ });
101
+ // Update chat timestamp
102
+ await this.prisma.aiChat.update({
103
+ where: { id: chatId },
104
+ data: { updatedAt: new Date() },
105
+ });
106
+ return message;
107
+ }
108
+ /**
109
+ * Get messages for a chat
110
+ */
111
+ async getMessages(chatId, limit, before) {
112
+ return this.prisma.aiChatMessage.findMany({
113
+ where: {
114
+ chatId,
115
+ ...(before && { createdAt: { lt: before } }),
116
+ },
117
+ orderBy: { createdAt: 'desc' },
118
+ take: limit,
119
+ });
120
+ }
121
+ /**
122
+ * Get message count for a chat
123
+ */
124
+ async getMessageCount(chatId) {
125
+ return this.prisma.aiChatMessage.count({ where: { chatId } });
126
+ }
127
+ }
128
+ //# sourceMappingURL=chat.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.repository.js","sourceRoot":"","sources":["../../src/chat/chat.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Chat Service — Agent Loop with Tool Calling
3
+ */
4
+ import type { AiChat } from '@prisma/client';
5
+ import type { CreateChatDto, UpdateChatDto, SendMessageDto, ChatMessageResponse, ChatStreamChunk, ChatContext, ChatServiceDependencies } from './chat.types.js';
6
+ export declare function initChatService(deps: ChatServiceDependencies): void;
7
+ export declare function getChatServiceDeps(): ChatServiceDependencies | null;
8
+ export declare class ChatService {
9
+ private repository;
10
+ static readonly MAX_CONTEXT_MESSAGES = 20;
11
+ static readonly MAX_AGENT_ITERATIONS = 10;
12
+ constructor();
13
+ private get logger();
14
+ private get llmService();
15
+ createChat(data: CreateChatDto): Promise<AiChat>;
16
+ sendMessage(dto: SendMessageDto): Promise<ChatMessageResponse>;
17
+ approveToolCall(chatId: string, toolName: string, args: Record<string, unknown>, userId: number, conversationState: string): Promise<ChatMessageResponse>;
18
+ streamMessage(dto: SendMessageDto): AsyncGenerator<ChatStreamChunk>;
19
+ getChat(id: string): Promise<AiChat | null>;
20
+ getChatWithMessages(id: string): Promise<ChatContext | null>;
21
+ getUserChats(userId: number, limit?: number): Promise<AiChat[]>;
22
+ updateChat(id: string, data: UpdateChatDto): Promise<AiChat>;
23
+ deleteChat(id: string): Promise<void>;
24
+ generateTitle(chatId: string): Promise<string>;
25
+ private getMemoryIntegration;
26
+ private detectAndSaveMemories;
27
+ }
28
+ //# sourceMappingURL=chat.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.service.d.ts","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAYhK,wBAAgB,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAA4C;AAChH,wBAAgB,kBAAkB,IAAI,uBAAuB,GAAG,IAAI,CAAkB;AAEtF,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAiB;IACnC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,MAAM;IAC1C,MAAM,CAAC,QAAQ,CAAC,oBAAoB,MAAM;;IAQ1C,OAAO,KAAK,MAAM,GAA4B;IAC9C,OAAO,KAAK,UAAU,GAAgC;IAEhD,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAShD,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6G9D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAuBxJ,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,cAAc,CAAC,eAAe,CAAC;IAsBpE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAC3C,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAI5D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC/D,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAErC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYpD,OAAO,CAAC,oBAAoB;YAId,qBAAqB;CAOpC"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Chat Service — Agent Loop with Tool Calling
3
+ */
4
+ import { ChatRepository, initChatRepository } from './chat.repository.js';
5
+ import { buildSystemPrompt } from './prompts/system.prompts.js';
6
+ import { ChatMemoryIntegration, getChatMemoryIntegrationDeps } from './chat-memory.integration.js';
7
+ import { MemoryDetector } from './memory-detector.js';
8
+ import { ResponseParser } from './response-parser.js';
9
+ import { getAllTools, executeTool, requiresApproval, toAnthropicTools } from '../tools/index.js';
10
+ let _deps = null;
11
+ export function initChatService(deps) { _deps = deps; initChatRepository(deps); }
12
+ export function getChatServiceDeps() { return _deps; }
13
+ export class ChatService {
14
+ repository;
15
+ static MAX_CONTEXT_MESSAGES = 20;
16
+ static MAX_AGENT_ITERATIONS = 10;
17
+ constructor() {
18
+ if (!_deps)
19
+ throw new Error('[ChatService] Not initialized!');
20
+ this.repository = new ChatRepository();
21
+ _deps.logger.info('ChatService initialized');
22
+ }
23
+ get logger() { return _deps.logger; }
24
+ get llmService() { return _deps.llmService; }
25
+ async createChat(data) {
26
+ const chat = await this.repository.createChat(data);
27
+ if (data.systemPrompt)
28
+ await this.repository.addMessage(chat.id, 'SYSTEM', data.systemPrompt);
29
+ this.logger.info('Chat created', { id: chat.id, mode: chat.mode });
30
+ return chat;
31
+ }
32
+ // ── Agent Loop sendMessage ─────────────────────────────────────
33
+ async sendMessage(dto) {
34
+ const startTime = Date.now();
35
+ const chat = await this.repository.findByIdWithMessages(dto.chatId, ChatService.MAX_CONTEXT_MESSAGES);
36
+ if (!chat)
37
+ throw new Error(`Chat ${dto.chatId} not found`);
38
+ const userMessage = await this.repository.addMessage(dto.chatId, 'USER', dto.content);
39
+ const systemPrompt = buildSystemPrompt(chat.mode, { customPrompt: chat.systemPrompt ?? undefined });
40
+ // Memory context
41
+ let memoryContext = '';
42
+ const usedMemoryIds = [];
43
+ const memoryInt = this.getMemoryIntegration();
44
+ if (memoryInt) {
45
+ try {
46
+ const sum = memoryInt.buildChatContextSummary(chat.messages);
47
+ const mems = await Promise.race([
48
+ memoryInt.getRelevantMemories(chat.userId, dto.content, sum),
49
+ new Promise((_, r) => setTimeout(() => r(new Error('timeout')), 5000)),
50
+ ]);
51
+ if (mems.length > 0) {
52
+ memoryContext = memoryInt.buildMemoryContext(mems);
53
+ usedMemoryIds.push(...mems.map(m => m.memory.id));
54
+ }
55
+ }
56
+ catch { /* continue */ }
57
+ }
58
+ // Build conversation
59
+ const llmMessages = [
60
+ { role: 'system', content: systemPrompt + memoryContext },
61
+ ...chat.messages.map(m => ({ role: m.role.toLowerCase(), content: m.content })),
62
+ { role: 'user', content: dto.content },
63
+ ];
64
+ const tools = toAnthropicTools();
65
+ const toolsCalled = [];
66
+ let finalContent = '';
67
+ let totalTokens = { prompt: 0, completion: 0, total: 0 };
68
+ // ── Loop ─────────────────────────────────────────────────────
69
+ for (let i = 0; i < ChatService.MAX_AGENT_ITERATIONS; i++) {
70
+ const res = await this.llmService.complete({
71
+ messages: llmMessages,
72
+ model: dto.model || chat.model,
73
+ temperature: chat.temperature,
74
+ tools: tools.length > 0 ? tools : undefined,
75
+ });
76
+ totalTokens.prompt += res.tokens.prompt;
77
+ totalTokens.completion += res.tokens.completion;
78
+ totalTokens.total += res.tokens.total;
79
+ // No tool calls → done
80
+ if (!res.toolCalls || res.toolCalls.length === 0) {
81
+ finalContent = res.content;
82
+ break;
83
+ }
84
+ const tc = res.toolCalls[0];
85
+ // WRITE tool → needs approval
86
+ if (requiresApproval(tc.name)) {
87
+ const tool = getAllTools().find(t => t.name === tc.name);
88
+ const approvalMsg = await this.repository.addMessage(dto.chatId, 'ASSISTANT', `I want to execute **${tc.name}**: \`\`\`json\n${JSON.stringify(tc.input, null, 2)}\n\`\`\`\nPlease confirm or reject.`);
89
+ return {
90
+ message: userMessage, assistantMessage: approvalMsg, usedMemories: usedMemoryIds,
91
+ tokens: totalTokens, latencyMs: Date.now() - startTime,
92
+ pendingApproval: {
93
+ id: `apv-${Date.now()}`, chatId: dto.chatId, toolName: tc.name,
94
+ toolDescription: tool?.description || tc.name, arguments: tc.input,
95
+ conversationState: JSON.stringify(llmMessages),
96
+ },
97
+ };
98
+ }
99
+ // READ tool → auto-execute
100
+ this.logger.info('Auto-executing tool', { tool: tc.name, iter: i });
101
+ const tStart = Date.now();
102
+ const result = await executeTool(tc.name, tc.input, chat.userId);
103
+ toolsCalled.push({ name: tc.name, durationMs: Date.now() - tStart });
104
+ // Append tool_use + tool_result to conversation
105
+ llmMessages.push({
106
+ role: 'assistant',
107
+ content: [
108
+ ...(res.content ? [{ type: 'text', text: res.content }] : []),
109
+ { type: 'tool_use', id: tc.id, name: tc.name, input: tc.input },
110
+ ],
111
+ });
112
+ llmMessages.push({
113
+ role: 'user',
114
+ content: [{ type: 'tool_result', tool_use_id: tc.id, content: JSON.stringify(result.data ?? result.error) }],
115
+ });
116
+ }
117
+ // Save final
118
+ const assistantMessage = await this.repository.addMessage(dto.chatId, 'ASSISTANT', finalContent, {
119
+ model: dto.model || chat.model, tokens: totalTokens.total, latencyMs: Date.now() - startTime, usedMemoryIds,
120
+ });
121
+ this.detectAndSaveMemories(chat.userId, dto.chatId, assistantMessage.id, dto.content, finalContent).catch(() => { });
122
+ // Auto-title on first user message
123
+ if (!chat.title && chat.messages.length <= 1) {
124
+ this.generateTitle(dto.chatId).catch(() => { });
125
+ }
126
+ const ctx = { memoriesUsed: usedMemoryIds.map(id => ({ id, title: '', score: 0 })), toolsCalled, modelUsed: dto.model || chat.model, tokens: totalTokens, latencyMs: Date.now() - startTime };
127
+ const structured = ResponseParser.parse(finalContent, ctx);
128
+ if (usedMemoryIds.length > 0)
129
+ structured.memory = { ...structured.memory, referencedIds: usedMemoryIds };
130
+ this.logger.debug('Agent loop done', { chatId: dto.chatId, tools: toolsCalled.length, latencyMs: Date.now() - startTime });
131
+ return { message: userMessage, assistantMessage, usedMemories: usedMemoryIds, tokens: totalTokens, latencyMs: Date.now() - startTime, structured };
132
+ }
133
+ // ── Approve pending tool call ──────────────────────────────────
134
+ async approveToolCall(chatId, toolName, args, userId, conversationState) {
135
+ const startTime = Date.now();
136
+ const result = await executeTool(toolName, args, userId);
137
+ this.logger.info('Approved tool executed', { tool: toolName, success: result.success });
138
+ // Resume conversation with tool result
139
+ const llmMessages = JSON.parse(conversationState);
140
+ const toolId = `tool-${Date.now()}`;
141
+ llmMessages.push({ role: 'assistant', content: [{ type: 'tool_use', id: toolId, name: toolName, input: args }] });
142
+ llmMessages.push({ role: 'user', content: [{ type: 'tool_result', tool_use_id: toolId, content: JSON.stringify(result.data ?? result.error) }] });
143
+ const chat = await this.repository.findByIdWithMessages(chatId, 3);
144
+ const res = await this.llmService.complete({ messages: llmMessages, model: chat?.model, tools: toAnthropicTools() });
145
+ const assistantMessage = await this.repository.addMessage(chatId, 'ASSISTANT', res.content, { model: res.model, tokens: res.tokens.total, latencyMs: res.latencyMs });
146
+ const ctx = { memoriesUsed: [], toolsCalled: [{ name: toolName, durationMs: Date.now() - startTime }], modelUsed: res.model, tokens: res.tokens, latencyMs: Date.now() - startTime };
147
+ const structured = ResponseParser.parse(res.content, ctx);
148
+ return { message: assistantMessage, assistantMessage, usedMemories: [], tokens: res.tokens, latencyMs: Date.now() - startTime, structured };
149
+ }
150
+ // ── Stream (unchanged, no tools) ───────────────────────────────
151
+ async *streamMessage(dto) {
152
+ const chat = await this.repository.findByIdWithMessages(dto.chatId, ChatService.MAX_CONTEXT_MESSAGES);
153
+ if (!chat) {
154
+ yield { type: 'error', error: `Chat not found` };
155
+ return;
156
+ }
157
+ await this.repository.addMessage(dto.chatId, 'USER', dto.content);
158
+ const systemPrompt = buildSystemPrompt(chat.mode, { customPrompt: chat.systemPrompt ?? undefined });
159
+ const msgs = [
160
+ { role: 'system', content: systemPrompt },
161
+ ...chat.messages.map(m => ({ role: m.role.toLowerCase(), content: m.content })),
162
+ { role: 'user', content: dto.content },
163
+ ];
164
+ let full = '';
165
+ try {
166
+ for await (const chunk of this.llmService.stream({ messages: msgs, model: dto.model || chat.model, temperature: chat.temperature })) {
167
+ full += chunk.content;
168
+ yield { type: 'content', content: chunk.content };
169
+ if (chunk.done)
170
+ break;
171
+ }
172
+ await this.repository.addMessage(dto.chatId, 'ASSISTANT', full, { model: dto.model || chat.model });
173
+ yield { type: 'done' };
174
+ }
175
+ catch (error) {
176
+ this.logger.error('Stream error', { error });
177
+ yield { type: 'error', error: String(error) };
178
+ }
179
+ }
180
+ // ── CRUD ───────────────────────────────────────────────────────
181
+ async getChat(id) { return this.repository.findById(id); }
182
+ async getChatWithMessages(id) {
183
+ const chat = await this.repository.findByIdWithMessages(id);
184
+ return chat ? { chat, messages: chat.messages } : null;
185
+ }
186
+ async getUserChats(userId, limit) { return this.repository.findByUser(userId, limit); }
187
+ async updateChat(id, data) { return this.repository.updateChat(id, data); }
188
+ async deleteChat(id) { await this.repository.deleteChat(id); }
189
+ async generateTitle(chatId) {
190
+ const chat = await this.repository.findByIdWithMessages(chatId, 3);
191
+ if (!chat?.messages.length)
192
+ return 'New Chat';
193
+ const first = chat.messages.find(m => m.role === 'USER');
194
+ if (!first)
195
+ return 'New Chat';
196
+ const title = first.content.slice(0, 50).trim();
197
+ await this.repository.updateChat(chatId, { title });
198
+ return title;
199
+ }
200
+ // ── Helpers ────────────────────────────────────────────────────
201
+ getMemoryIntegration() {
202
+ return getChatMemoryIntegrationDeps() ? new ChatMemoryIntegration() : null;
203
+ }
204
+ async detectAndSaveMemories(userId, chatId, messageId, userContent, assistantContent) {
205
+ const mi = this.getMemoryIntegration();
206
+ if (!mi)
207
+ return;
208
+ const sug = mi.detectMemorySuggestion(assistantContent);
209
+ if (sug.hasSuggestion && sug.suggestedContent)
210
+ await mi.suggestMemoryFromChat(chatId, messageId, userId, sug.suggestedContent, sug.suggestedType || 'INSIGHT');
211
+ const det = new MemoryDetector();
212
+ const mems = det.analyzeForMemories(userContent, assistantContent);
213
+ for (const m of mems)
214
+ await mi.suggestMemoryFromChat(chatId, messageId, userId, m.content, m.type);
215
+ }
216
+ }
217
+ //# sourceMappingURL=chat.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.service.js","sourceRoot":"","sources":["../../src/chat/chat.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Chat Service Types
3
+ * Type definitions for the Chat service and memory integration
4
+ */
5
+ import { ChatMode, MessageRole } from '@prisma/client';
6
+ import type { AiChat, AiChatMessage, AiMemory, MemoryType, Prisma, PrismaClient } from '@prisma/client';
7
+ export { ChatMode, MessageRole };
8
+ export type { AiChat, AiChatMessage, AiMemory, MemoryType };
9
+ export interface LoggerLike {
10
+ info(message: string, meta?: object): void;
11
+ error(message: string, meta?: object): void;
12
+ warn(message: string, meta?: object): void;
13
+ debug(message: string, meta?: object): void;
14
+ }
15
+ /**
16
+ * Memory service interface for chat integration
17
+ * Uses duck typing for loose coupling
18
+ */
19
+ export interface MemoryServiceLike {
20
+ searchMemories(request: {
21
+ userId: number;
22
+ query: string;
23
+ limit?: number;
24
+ scoreThreshold?: number;
25
+ }): Promise<Array<{
26
+ memory: AiMemory;
27
+ score: number;
28
+ }>>;
29
+ getRelevantMemoriesForContext(userId: number, query: string, maxMemories?: number): Promise<AiMemory[]>;
30
+ suggestMemory(data: {
31
+ userId: number;
32
+ type: MemoryType;
33
+ title: string;
34
+ content: string;
35
+ sourceType: 'CHAT';
36
+ sourceId: string;
37
+ confidence: number;
38
+ }): Promise<void>;
39
+ }
40
+ /**
41
+ * Chat service interface for internal operations
42
+ */
43
+ export interface ChatServiceInternalLike {
44
+ getChat(id: string): Promise<AiChat | null>;
45
+ }
46
+ /**
47
+ * LLM service interface for chat completions
48
+ */
49
+ export interface LLMServiceLike {
50
+ complete(request: {
51
+ messages: Array<{
52
+ role: string;
53
+ content: unknown;
54
+ }>;
55
+ model?: string;
56
+ temperature?: number;
57
+ maxTokens?: number;
58
+ tools?: Array<{
59
+ name: string;
60
+ description: string;
61
+ input_schema: unknown;
62
+ }>;
63
+ tool_choice?: string;
64
+ }): Promise<{
65
+ content: string;
66
+ model: string;
67
+ tokens: {
68
+ prompt: number;
69
+ completion: number;
70
+ total: number;
71
+ };
72
+ latencyMs: number;
73
+ toolCalls?: Array<{
74
+ id: string;
75
+ name: string;
76
+ input: Record<string, unknown>;
77
+ }>;
78
+ stopReason?: string;
79
+ }>;
80
+ stream(request: {
81
+ messages: Array<{
82
+ role: string;
83
+ content: unknown;
84
+ }>;
85
+ model?: string;
86
+ temperature?: number;
87
+ }): AsyncGenerator<{
88
+ content: string;
89
+ done: boolean;
90
+ }>;
91
+ }
92
+ export interface CreateChatDto {
93
+ userId: number;
94
+ workspaceId?: number;
95
+ title?: string;
96
+ mode?: ChatMode;
97
+ model?: string;
98
+ temperature?: number;
99
+ systemPrompt?: string;
100
+ }
101
+ export interface UpdateChatDto {
102
+ title?: string;
103
+ mode?: ChatMode;
104
+ model?: string;
105
+ temperature?: number;
106
+ systemPrompt?: string;
107
+ }
108
+ export interface SendMessageDto {
109
+ chatId: string;
110
+ content: string;
111
+ model?: string;
112
+ stream?: boolean;
113
+ }
114
+ export interface ChatMessageResponse {
115
+ message: AiChatMessage;
116
+ assistantMessage: AiChatMessage;
117
+ usedMemories: string[];
118
+ tokens: {
119
+ prompt: number;
120
+ completion: number;
121
+ total: number;
122
+ };
123
+ latencyMs: number;
124
+ structured?: import('./response.types.js').StructuredResponse;
125
+ /** If a write-tool needs user approval before execution */
126
+ pendingApproval?: PendingToolApproval;
127
+ }
128
+ export interface PendingToolApproval {
129
+ id: string;
130
+ chatId: string;
131
+ toolName: string;
132
+ toolDescription: string;
133
+ arguments: Record<string, unknown>;
134
+ /** Remaining conversation state for resuming after approval */
135
+ conversationState: string;
136
+ }
137
+ export interface ChatStreamChunk {
138
+ type: 'content' | 'memory' | 'done' | 'error';
139
+ content?: string;
140
+ memoryId?: string;
141
+ error?: string;
142
+ }
143
+ export interface ChatContext {
144
+ chat: AiChat;
145
+ messages: AiChatMessage[];
146
+ relevantMemories?: Array<{
147
+ id: string;
148
+ content: string;
149
+ score: number;
150
+ }>;
151
+ }
152
+ export interface ChatServiceDependencies {
153
+ prisma: Prisma.TransactionClient | PrismaClient;
154
+ logger: LoggerLike;
155
+ llmService: LLMServiceLike;
156
+ memoryService?: MemoryServiceLike;
157
+ }
158
+ /**
159
+ * Dependencies for chat memory integration
160
+ */
161
+ export interface ChatMemoryIntegrationDependencies {
162
+ logger: LoggerLike;
163
+ memoryService: MemoryServiceLike;
164
+ chatService: ChatServiceInternalLike;
165
+ }
166
+ /**
167
+ * Result of memory search with relevance score
168
+ */
169
+ export interface MemorySearchResult {
170
+ memory: AiMemory;
171
+ score: number;
172
+ }
173
+ /**
174
+ * Memory suggestion detection result
175
+ */
176
+ export interface MemorySuggestionResult {
177
+ hasSuggestion: boolean;
178
+ suggestedContent?: string;
179
+ suggestedType?: MemoryType;
180
+ }
181
+ /**
182
+ * Detected memory from conversation
183
+ */
184
+ export interface DetectedMemory {
185
+ type: MemoryType;
186
+ title: string;
187
+ content: string;
188
+ confidence: number;
189
+ trigger: string;
190
+ }
191
+ /**
192
+ * Configuration for memory detector
193
+ */
194
+ export interface MemoryDetectorConfig {
195
+ minConfidence: number;
196
+ enableAutoSuggestions: boolean;
197
+ }
198
+ //# sourceMappingURL=chat.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.types.d.ts","sourceRoot":"","sources":["../../src/chat/chat.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Chat Service Types
3
+ * Type definitions for the Chat service and memory integration
4
+ */
5
+ import { ChatMode, MessageRole } from '@prisma/client';
6
+ // Re-export Prisma enums
7
+ export { ChatMode, MessageRole };
8
+ //# sourceMappingURL=chat.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.types.js","sourceRoot":"","sources":["../../src/chat/chat.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGvD,yBAAyB;AACzB,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Chat Module Index
3
+ * Export all Chat service components
4
+ */
5
+ export type { ChatServiceInternalLike, LLMServiceLike, CreateChatDto, UpdateChatDto, SendMessageDto, ChatMessageResponse, ChatStreamChunk, ChatContext, ChatServiceDependencies, ChatMemoryIntegrationDependencies, MemorySuggestionResult, DetectedMemory, MemoryDetectorConfig, } from './chat.types.js';
6
+ export type { LoggerLike as ChatLoggerLike } from './chat.types.js';
7
+ export type { MemoryServiceLike as ChatMemoryServiceLike } from './chat.types.js';
8
+ export type { MemorySearchResult as ChatMemorySearchResult } from './chat.types.js';
9
+ export { ChatMode, MessageRole } from './chat.types.js';
10
+ export type { AiChat, AiChatMessage, AiMemory } from './chat.types.js';
11
+ export { ChatService, initChatService, getChatServiceDeps, } from './chat.service.js';
12
+ export { ChatRepository, initChatRepository, } from './chat.repository.js';
13
+ export { ChatMemoryIntegration, initChatMemoryIntegration, getChatMemoryIntegrationDeps, } from './chat-memory.integration.js';
14
+ export { MemoryDetector } from './memory-detector.js';
15
+ export type { MegaAgentPromptOptions } from './prompts/index.js';
16
+ export { MODE_PROMPTS, buildSystemPrompt, buildMemoryContextPrompt, } from './prompts/index.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chat/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,uBAAuB,EACvB,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,uBAAuB,EACvB,iCAAiC,EACjC,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACpE,YAAY,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAClF,YAAY,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGpF,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGvE,OAAO,EACL,WAAW,EACX,eAAe,EACf,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,cAAc,EACd,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC"}