chat-flow-ardymalihi 1.0.2

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +266 -0
  3. package/dist/adapters/db/InMemorySessionRepository.js +15 -0
  4. package/dist/adapters/db/RedisSessionRepository.js +41 -0
  5. package/dist/adapters/intent/IntentMatcher.d.ts +25 -0
  6. package/dist/adapters/intent/IntentMatcher.d.ts.map +1 -0
  7. package/dist/adapters/intent/IntentMatcher.js +89 -0
  8. package/dist/adapters/intent/IntentMatcher.js.map +1 -0
  9. package/dist/adapters/intent/IntentService.d.ts +27 -0
  10. package/dist/adapters/intent/IntentService.d.ts.map +1 -0
  11. package/dist/adapters/intent/IntentService.js +59 -0
  12. package/dist/adapters/intent/IntentService.js.map +1 -0
  13. package/dist/adapters/intent/MockIntentAdapter.js +29 -0
  14. package/dist/adapters/llm/GeminiLLMAdapter.d.ts +10 -0
  15. package/dist/adapters/llm/GeminiLLMAdapter.d.ts.map +1 -0
  16. package/dist/adapters/llm/GeminiLLMAdapter.js +102 -0
  17. package/dist/adapters/llm/GeminiLLMAdapter.js.map +1 -0
  18. package/dist/adapters/llm/MockLLMAdapter.d.ts +5 -0
  19. package/dist/adapters/llm/MockLLMAdapter.d.ts.map +1 -0
  20. package/dist/adapters/llm/MockLLMAdapter.js +31 -0
  21. package/dist/adapters/llm/MockLLMAdapter.js.map +1 -0
  22. package/dist/adapters/memory/InMemorySessionRepository.js +15 -0
  23. package/dist/adapters/redis/RedisSessionRepository.js +41 -0
  24. package/dist/adapters/repository/InMemoryRepository.d.ts +15 -0
  25. package/dist/adapters/repository/InMemoryRepository.d.ts.map +1 -0
  26. package/dist/adapters/repository/InMemoryRepository.js +41 -0
  27. package/dist/adapters/repository/InMemoryRepository.js.map +1 -0
  28. package/dist/adapters/repository/IntentRepository.d.ts +15 -0
  29. package/dist/adapters/repository/IntentRepository.d.ts.map +1 -0
  30. package/dist/adapters/repository/IntentRepository.js +28 -0
  31. package/dist/adapters/repository/IntentRepository.js.map +1 -0
  32. package/dist/adapters/repository/RedisRepository.d.ts +16 -0
  33. package/dist/adapters/repository/RedisRepository.d.ts.map +1 -0
  34. package/dist/adapters/repository/RedisRepository.js +87 -0
  35. package/dist/adapters/repository/RedisRepository.js.map +1 -0
  36. package/dist/adapters/workflow/MockWorkflowAdapter.d.ts +5 -0
  37. package/dist/adapters/workflow/MockWorkflowAdapter.d.ts.map +1 -0
  38. package/dist/adapters/workflow/MockWorkflowAdapter.js +162 -0
  39. package/dist/adapters/workflow/MockWorkflowAdapter.js.map +1 -0
  40. package/dist/application/ConversationSession.d.ts +23 -0
  41. package/dist/application/ConversationSession.d.ts.map +1 -0
  42. package/dist/application/ConversationSession.js +83 -0
  43. package/dist/application/ConversationSession.js.map +1 -0
  44. package/dist/application/Message.d.ts +11 -0
  45. package/dist/application/Message.d.ts.map +1 -0
  46. package/dist/application/Message.js +30 -0
  47. package/dist/application/Message.js.map +1 -0
  48. package/dist/application/Orchestrator.d.ts +18 -0
  49. package/dist/application/Orchestrator.d.ts.map +1 -0
  50. package/dist/application/Orchestrator.js +80 -0
  51. package/dist/application/Orchestrator.js.map +1 -0
  52. package/dist/application/SessionState.js +2 -0
  53. package/dist/application/usecases/CreateSession.js +20 -0
  54. package/dist/application/usecases/HandleUserMessage.js +69 -0
  55. package/dist/config/ChatFlowConfig.d.ts +59 -0
  56. package/dist/config/ChatFlowConfig.d.ts.map +1 -0
  57. package/dist/config/ChatFlowConfig.js +49 -0
  58. package/dist/config/ChatFlowConfig.js.map +1 -0
  59. package/dist/config/index.d.ts +2 -0
  60. package/dist/config/index.d.ts.map +1 -0
  61. package/dist/config/index.js +7 -0
  62. package/dist/config/index.js.map +1 -0
  63. package/dist/core/entities/ConversationSession.d.ts +23 -0
  64. package/dist/core/entities/ConversationSession.d.ts.map +1 -0
  65. package/dist/core/entities/ConversationSession.js +83 -0
  66. package/dist/core/entities/ConversationSession.js.map +1 -0
  67. package/dist/core/entities/Message.d.ts +11 -0
  68. package/dist/core/entities/Message.d.ts.map +1 -0
  69. package/dist/core/entities/Message.js +30 -0
  70. package/dist/core/entities/Message.js.map +1 -0
  71. package/dist/core/errors/ChatFlowError.d.ts +71 -0
  72. package/dist/core/errors/ChatFlowError.d.ts.map +1 -0
  73. package/dist/core/errors/ChatFlowError.js +108 -0
  74. package/dist/core/errors/ChatFlowError.js.map +1 -0
  75. package/dist/core/errors/index.d.ts +2 -0
  76. package/dist/core/errors/index.d.ts.map +1 -0
  77. package/dist/core/errors/index.js +15 -0
  78. package/dist/core/errors/index.js.map +1 -0
  79. package/dist/db/InMemoryRepository.d.ts +15 -0
  80. package/dist/db/InMemoryRepository.d.ts.map +1 -0
  81. package/dist/db/InMemoryRepository.js +41 -0
  82. package/dist/db/InMemoryRepository.js.map +1 -0
  83. package/dist/db/RedisRepository.d.ts +16 -0
  84. package/dist/db/RedisRepository.d.ts.map +1 -0
  85. package/dist/db/RedisRepository.js +87 -0
  86. package/dist/db/RedisRepository.js.map +1 -0
  87. package/dist/demo/cli-demo.d.ts +2 -0
  88. package/dist/demo/cli-demo.d.ts.map +1 -0
  89. package/dist/demo/cli-demo.js +142 -0
  90. package/dist/demo/cli-demo.js.map +1 -0
  91. package/dist/demo/console-chat.d.ts +2 -0
  92. package/dist/demo/console-chat.d.ts.map +1 -0
  93. package/dist/demo/console-chat.js +144 -0
  94. package/dist/demo/console-chat.js.map +1 -0
  95. package/dist/domain/conversation/ConversationSession.js +82 -0
  96. package/dist/domain/conversation/Message.js +33 -0
  97. package/dist/domain/conversation/SessionState.js +10 -0
  98. package/dist/index.d.ts +22 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +61 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/intent/IntentService.d.ts +17 -0
  103. package/dist/intent/IntentService.d.ts.map +1 -0
  104. package/dist/intent/IntentService.js +51 -0
  105. package/dist/intent/IntentService.js.map +1 -0
  106. package/dist/intent/MockIntentService.d.ts +6 -0
  107. package/dist/intent/MockIntentService.d.ts.map +1 -0
  108. package/dist/intent/MockIntentService.js +30 -0
  109. package/dist/intent/MockIntentService.js.map +1 -0
  110. package/dist/interfaces.d.ts +108 -0
  111. package/dist/interfaces.d.ts.map +1 -0
  112. package/dist/interfaces.js +18 -0
  113. package/dist/interfaces.js.map +1 -0
  114. package/dist/llm/GeminiLLMAdapter.d.ts +10 -0
  115. package/dist/llm/GeminiLLMAdapter.d.ts.map +1 -0
  116. package/dist/llm/GeminiLLMAdapter.js +102 -0
  117. package/dist/llm/GeminiLLMAdapter.js.map +1 -0
  118. package/dist/llm/MockLLMAdapter.d.ts +5 -0
  119. package/dist/llm/MockLLMAdapter.d.ts.map +1 -0
  120. package/dist/llm/MockLLMAdapter.js +31 -0
  121. package/dist/llm/MockLLMAdapter.js.map +1 -0
  122. package/dist/orchestrator/Orchestrator.d.ts +18 -0
  123. package/dist/orchestrator/Orchestrator.d.ts.map +1 -0
  124. package/dist/orchestrator/Orchestrator.js +80 -0
  125. package/dist/orchestrator/Orchestrator.js.map +1 -0
  126. package/dist/ports/IIntentRepository.d.ts +27 -0
  127. package/dist/ports/IIntentRepository.d.ts.map +1 -0
  128. package/dist/ports/IIntentRepository.js +3 -0
  129. package/dist/ports/IIntentRepository.js.map +1 -0
  130. package/dist/ports/IntentPort.js +2 -0
  131. package/dist/ports/LLMPort.js +2 -0
  132. package/dist/ports/SessionRepository.js +2 -0
  133. package/dist/ports/WorkflowPort.js +2 -0
  134. package/dist/scripts/debug-redis.d.ts +2 -0
  135. package/dist/scripts/debug-redis.d.ts.map +1 -0
  136. package/dist/scripts/debug-redis.js +55 -0
  137. package/dist/scripts/debug-redis.js.map +1 -0
  138. package/dist/scripts/verify_memory_intents.d.ts +2 -0
  139. package/dist/scripts/verify_memory_intents.d.ts.map +1 -0
  140. package/dist/scripts/verify_memory_intents.js +45 -0
  141. package/dist/scripts/verify_memory_intents.js.map +1 -0
  142. package/dist/scripts/verify_redis_intents.d.ts +2 -0
  143. package/dist/scripts/verify_redis_intents.d.ts.map +1 -0
  144. package/dist/scripts/verify_redis_intents.js +50 -0
  145. package/dist/scripts/verify_redis_intents.js.map +1 -0
  146. package/dist/verify_memory_intents.js +44 -0
  147. package/dist/verify_redis_intents.js +49 -0
  148. package/dist/workflow/MockWorkflowAdapter.d.ts +5 -0
  149. package/dist/workflow/MockWorkflowAdapter.d.ts.map +1 -0
  150. package/dist/workflow/MockWorkflowAdapter.js +162 -0
  151. package/dist/workflow/MockWorkflowAdapter.js.map +1 -0
  152. package/package.json +78 -0
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeminiLLMAdapter = void 0;
4
+ const generative_ai_1 = require("@google/generative-ai");
5
+ const interfaces_1 = require("../../interfaces");
6
+ class GeminiLLMAdapter {
7
+ constructor(apiKey) {
8
+ this.genAI = new generative_ai_1.GoogleGenerativeAI(apiKey);
9
+ this.model = this.genAI.getGenerativeModel({ model: 'gemini-2.0-flash-lite' });
10
+ }
11
+ async generateResponse(systemPrompt, history) {
12
+ // 1. Convert History to Gemini Format
13
+ // Note: Gemini API treats 'user' and 'model' roles.
14
+ // We prepend the sensitive system prompt via the chat history or handle it if the SDK supports systemInstruction (newer versions do).
15
+ // For simplicity with strictly message history:
16
+ // 1. Convert History to Gemini Format
17
+ // Note: Gemini API treats 'user' and 'model' roles.
18
+ // We prepend the sensitive system prompt via the chat history or handle it if the SDK supports systemInstruction (newer versions do).
19
+ // For simplicity with strictly message history:
20
+ const validHistory = [];
21
+ let systemContext = "";
22
+ for (const msg of history) {
23
+ if (msg.role === interfaces_1.Role.SYSTEM) {
24
+ // Collect system messages to prepend to the next user message or context
25
+ systemContext += `${msg.content}\n`;
26
+ continue;
27
+ }
28
+ const role = msg.role === interfaces_1.Role.USER ? 'user' : 'model';
29
+ validHistory.push({
30
+ role,
31
+ parts: [{ text: msg.content }]
32
+ });
33
+ }
34
+ // 2. Start Chat (or use generateContent with history context)
35
+ // Using startChat allows maintain context if we needed state, but we are stateless here mostly.
36
+ // However, we want to inject the "system prompt".
37
+ // We'll prepend it as a user message or use the systemInstruction property if available in the specific model/version usage.
38
+ // A common pattern for models without explicit system role in message list is to prepend to first user message or separate config.
39
+ // Let's use the simple chat approach.
40
+ const chat = this.model.startChat({
41
+ history: validHistory,
42
+ // systemInstruction: systemPrompt // Available in newer models/SDKs
43
+ });
44
+ // But wait, 'startChat' requires the history TO NOT include the *last* user message if we are about to send it via sendMessage.
45
+ // "history" here is the *past* messages.
46
+ // The *current* message (last one) should be sent via sendMessage.
47
+ // Let's re-slice.
48
+ const pastHistory = validHistory.slice(0, -1);
49
+ const lastMessage = validHistory[validHistory.length - 1];
50
+ // If for some reason history is empty (shouldn't happen in this flow as user just spoke), handle it.
51
+ const msgToSend = lastMessage ? lastMessage.parts[0].text : 'Hello';
52
+ // Prepend system prompt AND any collected systemContext to the context.
53
+ // Easiest hack: Prepend a "User" message with "Instructions: ..." at the very start of history.
54
+ const fullSystemInstruction = `[System Instructions]: ${systemPrompt}\n\n[Context]: ${systemContext}`;
55
+ if (pastHistory.length === 0) {
56
+ // No history, so this is the first message. Combine system prompt.
57
+ // Actually, we can't modify msgToSend easily if we want strict separation, but let's just prepend instruction to the first message of the session.
58
+ // However, since we are re-instantiating chat every request (stateless adapter), we can just craft the history.
59
+ }
60
+ else {
61
+ // Inject system prompt into the first message of pastHistory
62
+ pastHistory[0].parts[0].text = `${fullSystemInstruction}\n\n${pastHistory[0].parts[0].text}`;
63
+ }
64
+ // Note: If pastHistory is empty, we must inject into msgToSend.
65
+ let finalMsgToSend = msgToSend;
66
+ if (pastHistory.length === 0) {
67
+ finalMsgToSend = `${fullSystemInstruction}\n\n${msgToSend}`;
68
+ }
69
+ try {
70
+ const chatSession = this.model.startChat({
71
+ history: pastHistory,
72
+ });
73
+ const result = await chatSession.sendMessage(finalMsgToSend);
74
+ const response = await result.response;
75
+ const text = response.text();
76
+ return {
77
+ content: text,
78
+ usage: {
79
+ // Gemini doesn't always return token info easily in simple response, defaulting
80
+ promptTokens: 0,
81
+ completionTokens: 0
82
+ }
83
+ };
84
+ }
85
+ catch (error) {
86
+ console.error('Gemini API Error:', error);
87
+ return {
88
+ content: "I'm sorry, I'm having trouble connecting to my brain right now.",
89
+ usage: {
90
+ promptTokens: 0,
91
+ completionTokens: 0
92
+ }
93
+ };
94
+ }
95
+ }
96
+ async generateContent(prompt) {
97
+ const response = await this.model.generateContent(prompt);
98
+ return response.response.text();
99
+ }
100
+ }
101
+ exports.GeminiLLMAdapter = GeminiLLMAdapter;
102
+ //# sourceMappingURL=GeminiLLMAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiLLMAdapter.js","sourceRoot":"","sources":["../../../src/adapters/llm/GeminiLLMAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ILLMAdapter, LLMResponse, Message } from '../../interfaces';
2
+ export declare class MockLLMAdapter implements ILLMAdapter {
3
+ generateResponse(systemPrompt: string, history: Message[]): Promise<LLMResponse>;
4
+ }
5
+ //# sourceMappingURL=MockLLMAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockLLMAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/llm/MockLLMAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAErE,qBAAa,cAAe,YAAW,WAAW;IACxC,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAwBzF"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockLLMAdapter = void 0;
4
+ class MockLLMAdapter {
5
+ async generateResponse(systemPrompt, history) {
6
+ const lastMsg = history[history.length - 1].content.toLowerCase();
7
+ let content = "I can help with that.";
8
+ // Basic mock logic to respond to workflow data
9
+ if (lastMsg.includes('system info: workflow detected')) {
10
+ if (lastMsg.includes('booking_confirmed')) {
11
+ content = "You are all set! I have booked flight AC123 for you. Reference: SKY-999-XYZ. Safe travels!";
12
+ }
13
+ else if (lastMsg.includes('found_flights')) {
14
+ content = "I found a couple of flights to Paris. There is one at 10:00 AM ($500) and another at 2:00 PM ($450). Do you prefer the morning or afternoon one?";
15
+ }
16
+ else {
17
+ content = "I have checked the system and have the information you need.";
18
+ }
19
+ }
20
+ else {
21
+ // Default generic chat
22
+ content = `This is a mock AI response to: "${lastMsg}".`;
23
+ }
24
+ return {
25
+ content,
26
+ usage: { promptTokens: 10, completionTokens: 10 }
27
+ };
28
+ }
29
+ }
30
+ exports.MockLLMAdapter = MockLLMAdapter;
31
+ //# sourceMappingURL=MockLLMAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockLLMAdapter.js","sourceRoot":"","sources":["../../../src/adapters/llm/MockLLMAdapter.ts"],"names":[],"mappings":";;;AAEA,MAAa,cAAc;IACvB,KAAK,CAAC,gBAAgB,CAAC,YAAoB,EAAE,OAAkB;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAElE,IAAI,OAAO,GAAG,uBAAuB,CAAC;QAEtC,+CAA+C;QAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACrD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACxC,OAAO,GAAG,4FAA4F,CAAC;YAC3G,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC3C,OAAO,GAAG,kJAAkJ,CAAC;YACjK,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,8DAA8D,CAAC;YAC7E,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,uBAAuB;YACvB,OAAO,GAAG,mCAAmC,OAAO,IAAI,CAAC;QAC7D,CAAC;QAED,OAAO;YACH,OAAO;YACP,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACpD,CAAC;IACN,CAAC;CACJ;AAzBD,wCAyBC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemorySessionRepository = void 0;
4
+ class InMemorySessionRepository {
5
+ constructor() {
6
+ this.sessions = new Map();
7
+ }
8
+ async save(session) {
9
+ this.sessions.set(session.sessionId, session);
10
+ }
11
+ async findById(sessionId) {
12
+ return this.sessions.get(sessionId) || null;
13
+ }
14
+ }
15
+ exports.InMemorySessionRepository = InMemorySessionRepository;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedisSessionRepository = void 0;
7
+ const ioredis_1 = __importDefault(require("ioredis"));
8
+ const ConversationSession_1 = require("../../domain/conversation/ConversationSession");
9
+ class RedisSessionRepository {
10
+ constructor(connectionString = 'redis://localhost:6379') {
11
+ this.TTL_SECONDS = 3600; // 1 Hour Expiry
12
+ this.client = new ioredis_1.default(connectionString);
13
+ this.client.on('error', (err) => {
14
+ console.error('[Redis Error]', err);
15
+ });
16
+ }
17
+ async save(session) {
18
+ const key = `session:${session.sessionId}`;
19
+ const data = JSON.stringify(session.toSnapshot());
20
+ await this.client.set(key, data, 'EX', this.TTL_SECONDS);
21
+ }
22
+ async findById(sessionId) {
23
+ const key = `session:${sessionId}`;
24
+ const data = await this.client.get(key);
25
+ if (!data)
26
+ return null;
27
+ try {
28
+ const parsed = JSON.parse(data);
29
+ return ConversationSession_1.ConversationSession.reconstitute(parsed);
30
+ }
31
+ catch (err) {
32
+ console.error(`Failed to reconstitute session ${sessionId}`, err);
33
+ return null;
34
+ }
35
+ }
36
+ // Helper to close connection
37
+ async disconnect() {
38
+ await this.client.quit();
39
+ }
40
+ }
41
+ exports.RedisSessionRepository = RedisSessionRepository;
@@ -0,0 +1,15 @@
1
+ import { IRepository, Intent } from '../../interfaces';
2
+ import { ConversationSession } from '../../core/entities/ConversationSession';
3
+ export declare class InMemoryRepository implements IRepository {
4
+ private sessions;
5
+ private intents;
6
+ saveSession(session: ConversationSession): Promise<void>;
7
+ findSessionById(sessionId: string): Promise<ConversationSession | null>;
8
+ saveIntent(intent: Intent): Promise<void>;
9
+ upsertIntents(intents: Intent[]): Promise<void>;
10
+ findIntentByName(name: string): Promise<Intent | null>;
11
+ getAllIntents(): Promise<Intent[]>;
12
+ deleteIntent(name: string): Promise<void>;
13
+ searchIntents(embedding: number[], topK?: number): Promise<Intent[]>;
14
+ }
15
+ //# sourceMappingURL=InMemoryRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryRepository.d.ts","sourceRoot":"","sources":["../../../src/adapters/repository/InMemoryRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAE9E,qBAAa,kBAAmB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,OAAO,CAAkC;IAE3C,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAKvE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKtD,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAKjF"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryRepository = void 0;
4
+ class InMemoryRepository {
5
+ constructor() {
6
+ this.sessions = new Map();
7
+ this.intents = new Map();
8
+ }
9
+ async saveSession(session) {
10
+ this.sessions.set(session.sessionId, session);
11
+ }
12
+ async findSessionById(sessionId) {
13
+ return this.sessions.get(sessionId) || null;
14
+ }
15
+ // Intent Management
16
+ async saveIntent(intent) {
17
+ this.intents.set(intent.name, intent);
18
+ }
19
+ async upsertIntents(intents) {
20
+ for (const intent of intents) {
21
+ this.intents.set(intent.name, intent);
22
+ }
23
+ }
24
+ async findIntentByName(name) {
25
+ const intent = this.intents.get(name);
26
+ return intent || null;
27
+ }
28
+ async getAllIntents() {
29
+ return Array.from(this.intents.values());
30
+ }
31
+ async deleteIntent(name) {
32
+ this.intents.delete(name);
33
+ }
34
+ async searchIntents(embedding, topK = 10) {
35
+ // Naive mock implementation: return all intents up to topK
36
+ // Real implementation would use cosine similarity between embedding and intent.embedding
37
+ return Array.from(this.intents.values()).slice(0, topK);
38
+ }
39
+ }
40
+ exports.InMemoryRepository = InMemoryRepository;
41
+ //# sourceMappingURL=InMemoryRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryRepository.js","sourceRoot":"","sources":["../../../src/adapters/repository/InMemoryRepository.ts"],"names":[],"mappings":";;;AAGA,MAAa,kBAAkB;IAA/B;QACY,aAAQ,GAAqC,IAAI,GAAG,EAAE,CAAC;QACvD,YAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IAuCrD,CAAC;IArCG,KAAK,CAAC,WAAW,CAAC,OAA4B;QAC1C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB;QACnC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAChD,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,UAAU,CAAC,MAAc;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAiB;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,MAAM,IAAI,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,aAAa;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAmB,EAAE,OAAe,EAAE;QACtD,2DAA2D;QAC3D,yFAAyF;QACzF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;CACJ;AAzCD,gDAyCC"}
@@ -0,0 +1,15 @@
1
+ import { IIntentRepository } from '../../ports/IIntentRepository';
2
+ import { IRepository, Intent } from '../../interfaces';
3
+ /**
4
+ * Intent repository implementation using the main repository
5
+ */
6
+ export declare class IntentRepository implements IIntentRepository {
7
+ private repository;
8
+ constructor(repository: IRepository);
9
+ saveIntent(intent: Intent): Promise<void>;
10
+ upsertIntents(intents: Intent[]): Promise<void>;
11
+ findIntentByName(name: string): Promise<Intent | null>;
12
+ getAllIntents(): Promise<Intent[]>;
13
+ deleteIntent(name: string): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=IntentRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntentRepository.d.ts","sourceRoot":"","sources":["../../../src/adapters/repository/IntentRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;GAEG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IAC1C,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,WAAW;IAErC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAItD,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGlD"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IntentRepository = void 0;
4
+ /**
5
+ * Intent repository implementation using the main repository
6
+ */
7
+ class IntentRepository {
8
+ constructor(repository) {
9
+ this.repository = repository;
10
+ }
11
+ async saveIntent(intent) {
12
+ return this.repository.saveIntent(intent);
13
+ }
14
+ async upsertIntents(intents) {
15
+ return this.repository.upsertIntents(intents);
16
+ }
17
+ async findIntentByName(name) {
18
+ return this.repository.findIntentByName(name);
19
+ }
20
+ async getAllIntents() {
21
+ return this.repository.getAllIntents();
22
+ }
23
+ async deleteIntent(name) {
24
+ return this.repository.deleteIntent(name);
25
+ }
26
+ }
27
+ exports.IntentRepository = IntentRepository;
28
+ //# sourceMappingURL=IntentRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntentRepository.js","sourceRoot":"","sources":["../../../src/adapters/repository/IntentRepository.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,gBAAgB;IACzB,YAAoB,UAAuB;QAAvB,eAAU,GAAV,UAAU,CAAa;IAAI,CAAC;IAEhD,KAAK,CAAC,UAAU,CAAC,MAAc;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAiB;QACjC,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAY;QAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,aAAa;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACJ;AAtBD,4CAsBC"}
@@ -0,0 +1,16 @@
1
+ import { IRepository as IRepository, Intent } from '../../interfaces';
2
+ import { ConversationSession } from '../../core/entities/ConversationSession';
3
+ export declare class RedisRepository implements IRepository {
4
+ private client;
5
+ private readonly SESSION_TTL;
6
+ constructor(connectionString?: string);
7
+ saveSession(session: ConversationSession): Promise<void>;
8
+ findSessionById(sessionId: string): Promise<ConversationSession | null>;
9
+ saveIntent(intent: Intent): Promise<void>;
10
+ upsertIntents(intents: Intent[]): Promise<void>;
11
+ findIntentByName(name: string): Promise<Intent | null>;
12
+ deleteIntent(name: string): Promise<void>;
13
+ getAllIntents(): Promise<Intent[]>;
14
+ disconnect(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=RedisRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisRepository.d.ts","sourceRoot":"","sources":["../../../src/adapters/repository/RedisRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAE9E,qBAAa,eAAgB,YAAW,WAAW;IAC/C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,gBAAgB,GAAE,MAAiC;IASzD,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAiBvE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOtD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAyBlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedisRepository = void 0;
7
+ const ioredis_1 = __importDefault(require("ioredis"));
8
+ const ConversationSession_1 = require("../../core/entities/ConversationSession");
9
+ class RedisRepository {
10
+ constructor(connectionString = 'redis://localhost:6379') {
11
+ this.SESSION_TTL = 3600; // 1 Hour
12
+ this.client = new ioredis_1.default(connectionString);
13
+ this.client.on('error', (err) => {
14
+ console.error('[Redis Error]', err);
15
+ });
16
+ }
17
+ // Session Management (Existing)
18
+ async saveSession(session) {
19
+ const key = `session:${session.sessionId}`;
20
+ const data = JSON.stringify(session.toSnapshot());
21
+ await this.client.set(key, data, 'EX', this.SESSION_TTL);
22
+ }
23
+ async findSessionById(sessionId) {
24
+ const key = `session:${sessionId}`;
25
+ const data = await this.client.get(key);
26
+ if (!data)
27
+ return null;
28
+ try {
29
+ const parsed = JSON.parse(data);
30
+ return ConversationSession_1.ConversationSession.reconstitute(parsed);
31
+ }
32
+ catch (err) {
33
+ console.error(`Failed to reconstitute session ${sessionId}`, err);
34
+ return null;
35
+ }
36
+ }
37
+ // Intent Management (Data Access Only)
38
+ async saveIntent(intent) {
39
+ const key = `intent:${intent.name}`;
40
+ await this.client.call('JSON.SET', key, '$', JSON.stringify(intent));
41
+ }
42
+ async upsertIntents(intents) {
43
+ for (const intent of intents) {
44
+ // The embedding should be provided by the caller or handled externally
45
+ // This repository is now purely for data access.
46
+ await this.saveIntent(intent);
47
+ }
48
+ }
49
+ async findIntentByName(name) {
50
+ const key = `intent:${name}`;
51
+ const data = await this.client.call('JSON.GET', key);
52
+ if (!data)
53
+ return null;
54
+ return typeof data === 'string' ? JSON.parse(data) : data;
55
+ }
56
+ async deleteIntent(name) {
57
+ const key = `intent:${name}`;
58
+ await this.client.del(key);
59
+ }
60
+ async getAllIntents() {
61
+ // Scan for keys with intent prefix
62
+ const keys = await this.client.keys('intent:*');
63
+ if (keys.length === 0)
64
+ return [];
65
+ // Use JSON.MGET to fetch all
66
+ // Note: JSON.MGET might not be supported in all ioredis versions directly, but call works
67
+ // However, standard MGET doesn't work for JSON types in some versions depending on module loading
68
+ // Safer to loop or use pipeline
69
+ const pipeline = this.client.pipeline();
70
+ keys.forEach(key => pipeline.call('JSON.GET', key));
71
+ const results = await pipeline.exec();
72
+ if (!results)
73
+ return [];
74
+ return results
75
+ .map(([err, res]) => {
76
+ if (err || !res)
77
+ return null;
78
+ return typeof res === 'string' ? JSON.parse(res) : res;
79
+ })
80
+ .filter((i) => i !== null);
81
+ }
82
+ async disconnect() {
83
+ await this.client.quit();
84
+ }
85
+ }
86
+ exports.RedisRepository = RedisRepository;
87
+ //# sourceMappingURL=RedisRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisRepository.js","sourceRoot":"","sources":["../../../src/adapters/repository/RedisRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { IWorkflowAdapter, WorkflowResult } from '../../interfaces';
2
+ export declare class MockWorkflowAdapter implements IWorkflowAdapter {
3
+ executeWorkflow(intentName: string, payload: any): Promise<WorkflowResult>;
4
+ }
5
+ //# sourceMappingURL=MockWorkflowAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockWorkflowAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/workflow/MockWorkflowAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAuDpE,qBAAa,mBAAoB,YAAW,gBAAgB;IAClD,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;CAsInF"}
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockWorkflowAdapter = void 0;
4
+ const MOCK_FLIGHTS = [
5
+ {
6
+ id: 'SW218',
7
+ airline: 'SkyWay Travel',
8
+ flightNumber: 'SW218',
9
+ origin: 'London',
10
+ destination: 'Paris',
11
+ departureTime: '09:30',
12
+ arrivalTime: '11:50',
13
+ price: 120,
14
+ currency: 'GBP',
15
+ seatsAvailable: 12
16
+ },
17
+ {
18
+ id: 'SW342',
19
+ airline: 'SkyWay Travel',
20
+ flightNumber: 'SW342',
21
+ origin: 'London',
22
+ destination: 'Paris',
23
+ departureTime: '13:15',
24
+ arrivalTime: '15:35',
25
+ price: 105,
26
+ currency: 'GBP',
27
+ seatsAvailable: 5
28
+ },
29
+ {
30
+ id: 'SW410',
31
+ airline: 'SkyWay Travel',
32
+ flightNumber: 'SW410',
33
+ origin: 'London',
34
+ destination: 'Paris',
35
+ departureTime: '18:00',
36
+ arrivalTime: '20:20',
37
+ price: 135,
38
+ currency: 'GBP',
39
+ seatsAvailable: 20
40
+ }
41
+ ];
42
+ class MockWorkflowAdapter {
43
+ async executeWorkflow(intentName, payload) {
44
+ console.log(`[MockWorkflow] Executing ${intentName} with payload:`, payload);
45
+ // 1. Flight Search
46
+ if (intentName === 'FLIGHTS_INQUIRY') {
47
+ const { origin, destination } = payload;
48
+ // Normalize for matching
49
+ const originCity = (origin || "").toLowerCase();
50
+ const destCity = (destination || "").toLowerCase();
51
+ // Default to London -> Paris if inputs are vague for the demo script
52
+ const matches = MOCK_FLIGHTS.filter(f => {
53
+ const matchOrg = f.origin.toLowerCase().includes(originCity);
54
+ const matchDest = f.destination.toLowerCase().includes(destCity);
55
+ return matchOrg && matchDest;
56
+ });
57
+ if (matches.length === 0) {
58
+ // Fallback for demo if users says "flights to paris" without origin,
59
+ // we might just return them if we assume context, but let's stick to filters.
60
+ if (destCity.includes('paris') && !origin) {
61
+ // Suggest London? Or just show all to Paris?
62
+ // Let's filter just by Dest
63
+ const destMatches = MOCK_FLIGHTS.filter(f => f.destination.toLowerCase().includes(destCity));
64
+ return {
65
+ success: true,
66
+ data: {
67
+ found: true,
68
+ count: destMatches.length,
69
+ flights: destMatches.map(f => ({
70
+ id: f.id,
71
+ summary: `Flight ${f.flightNumber}: ${f.origin} (${f.departureTime}) -> ${f.destination} (${f.arrivalTime}) - £${f.price}`
72
+ })),
73
+ message: `Here are specific flights to ${destination}.`
74
+ }
75
+ };
76
+ }
77
+ return {
78
+ success: true,
79
+ data: {
80
+ found: false,
81
+ message: `No flights found explicitly from ${origin} to ${destination}.`
82
+ }
83
+ };
84
+ }
85
+ // Return detailed list formatted for the bot to read out
86
+ return {
87
+ success: true,
88
+ data: {
89
+ found: true,
90
+ count: matches.length,
91
+ flights: matches.map(f => ({
92
+ id: f.id,
93
+ summary: `Flight ${f.flightNumber}: ${f.origin} (${f.departureTime}) -> ${f.destination} (${f.arrivalTime}) - £${f.price}`
94
+ }))
95
+ }
96
+ };
97
+ }
98
+ // 2. Select Flight
99
+ if (intentName === 'SELECT_FLIGHT') {
100
+ const { flight_id } = payload;
101
+ // Try to fuzzy match SW...
102
+ const flight = MOCK_FLIGHTS.find(f => f.id.toLowerCase() === (flight_id || "").toLowerCase() ||
103
+ f.flightNumber.toLowerCase() === (flight_id || "").toLowerCase());
104
+ if (flight) {
105
+ return {
106
+ success: true,
107
+ data: {
108
+ status: 'selection_confirmed',
109
+ selected_flight: flight,
110
+ message: `Great choice. To complete the booking for Flight ${flight.flightNumber}, I'll need a few details: First name, Last name, and Email address.`
111
+ }
112
+ };
113
+ }
114
+ // If payload is empty or not matching, maybe LLM passed "second one"
115
+ // We can't easily resolve "second one" without state history in the workflow adapter.
116
+ // But the LLM Orchestrator might have done it?
117
+ // Actually, the intent extractor extracts "Flight SW342" usually.
118
+ return {
119
+ success: true,
120
+ data: {
121
+ status: 'selection_unknown',
122
+ message: "Which flight would you like? Please specify the flight number (e.g., SW342)."
123
+ }
124
+ };
125
+ }
126
+ // 3. Book Flight (Collect Details)
127
+ if (intentName === 'BOOK_FLIGHT') {
128
+ const { first_name, last_name, email } = payload;
129
+ if (!first_name || !last_name || !email) {
130
+ return {
131
+ success: false,
132
+ data: {
133
+ status: 'missing_info',
134
+ message: "I need your First Name, Last Name, and Email to proceed."
135
+ }
136
+ };
137
+ }
138
+ return {
139
+ success: true,
140
+ data: {
141
+ status: 'booking_confirmed',
142
+ confirmation_message: `Thank you, ${first_name}. Your booking has been successfully completed. A confirmation email has been sent to ${email}. Safe travels!`
143
+ }
144
+ };
145
+ }
146
+ // 4. Flight Info (Legacy/General)
147
+ if (intentName === 'FLIGHT_INFO') {
148
+ return {
149
+ success: true,
150
+ data: {
151
+ message: "Please select a flight to book."
152
+ }
153
+ };
154
+ }
155
+ return {
156
+ success: false,
157
+ error: `Unknown workflow: ${intentName}`
158
+ };
159
+ }
160
+ }
161
+ exports.MockWorkflowAdapter = MockWorkflowAdapter;
162
+ //# sourceMappingURL=MockWorkflowAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockWorkflowAdapter.js","sourceRoot":"","sources":["../../../src/adapters/workflow/MockWorkflowAdapter.ts"],"names":[],"mappings":"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"}