@hazeljs/messaging 0.2.0-beta.30

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 (107) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +186 -0
  3. package/dist/adapters/telegram.adapter.d.ts +24 -0
  4. package/dist/adapters/telegram.adapter.d.ts.map +1 -0
  5. package/dist/adapters/telegram.adapter.js +70 -0
  6. package/dist/adapters/telegram.adapter.js.map +1 -0
  7. package/dist/adapters/telegram.adapter.test.d.ts +2 -0
  8. package/dist/adapters/telegram.adapter.test.d.ts.map +1 -0
  9. package/dist/adapters/telegram.adapter.test.js +110 -0
  10. package/dist/adapters/telegram.adapter.test.js.map +1 -0
  11. package/dist/adapters/viber.adapter.d.ts +29 -0
  12. package/dist/adapters/viber.adapter.d.ts.map +1 -0
  13. package/dist/adapters/viber.adapter.js +98 -0
  14. package/dist/adapters/viber.adapter.js.map +1 -0
  15. package/dist/adapters/viber.adapter.test.d.ts +2 -0
  16. package/dist/adapters/viber.adapter.test.d.ts.map +1 -0
  17. package/dist/adapters/viber.adapter.test.js +73 -0
  18. package/dist/adapters/viber.adapter.test.js.map +1 -0
  19. package/dist/adapters/whatsapp.adapter.d.ts +26 -0
  20. package/dist/adapters/whatsapp.adapter.d.ts.map +1 -0
  21. package/dist/adapters/whatsapp.adapter.js +87 -0
  22. package/dist/adapters/whatsapp.adapter.js.map +1 -0
  23. package/dist/adapters/whatsapp.adapter.test.d.ts +2 -0
  24. package/dist/adapters/whatsapp.adapter.test.d.ts.map +1 -0
  25. package/dist/adapters/whatsapp.adapter.test.js +198 -0
  26. package/dist/adapters/whatsapp.adapter.test.js.map +1 -0
  27. package/dist/index.d.ts +24 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +27 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/messaging-kafka.bootstrap.d.ts +14 -0
  32. package/dist/messaging-kafka.bootstrap.d.ts.map +1 -0
  33. package/dist/messaging-kafka.bootstrap.js +42 -0
  34. package/dist/messaging-kafka.bootstrap.js.map +1 -0
  35. package/dist/messaging-kafka.bootstrap.test.d.ts +2 -0
  36. package/dist/messaging-kafka.bootstrap.test.d.ts.map +1 -0
  37. package/dist/messaging-kafka.bootstrap.test.js +34 -0
  38. package/dist/messaging-kafka.bootstrap.test.js.map +1 -0
  39. package/dist/messaging-kafka.consumer.d.ts +10 -0
  40. package/dist/messaging-kafka.consumer.d.ts.map +1 -0
  41. package/dist/messaging-kafka.consumer.js +80 -0
  42. package/dist/messaging-kafka.consumer.js.map +1 -0
  43. package/dist/messaging-kafka.consumer.test.d.ts +2 -0
  44. package/dist/messaging-kafka.consumer.test.d.ts.map +1 -0
  45. package/dist/messaging-kafka.consumer.test.js +129 -0
  46. package/dist/messaging-kafka.consumer.test.js.map +1 -0
  47. package/dist/messaging-kafka.types.d.ts +10 -0
  48. package/dist/messaging-kafka.types.d.ts.map +1 -0
  49. package/dist/messaging-kafka.types.js +5 -0
  50. package/dist/messaging-kafka.types.js.map +1 -0
  51. package/dist/messaging-kafka.types.test.d.ts +2 -0
  52. package/dist/messaging-kafka.types.test.d.ts.map +1 -0
  53. package/dist/messaging-kafka.types.test.js +12 -0
  54. package/dist/messaging-kafka.types.test.js.map +1 -0
  55. package/dist/messaging.controller.d.ts +27 -0
  56. package/dist/messaging.controller.d.ts.map +1 -0
  57. package/dist/messaging.controller.js +151 -0
  58. package/dist/messaging.controller.js.map +1 -0
  59. package/dist/messaging.controller.test.d.ts +2 -0
  60. package/dist/messaging.controller.test.d.ts.map +1 -0
  61. package/dist/messaging.controller.test.js +184 -0
  62. package/dist/messaging.controller.test.js.map +1 -0
  63. package/dist/messaging.module.d.ts +69 -0
  64. package/dist/messaging.module.d.ts.map +1 -0
  65. package/dist/messaging.module.js +152 -0
  66. package/dist/messaging.module.js.map +1 -0
  67. package/dist/messaging.module.test.d.ts +2 -0
  68. package/dist/messaging.module.test.d.ts.map +1 -0
  69. package/dist/messaging.module.test.js +97 -0
  70. package/dist/messaging.module.test.js.map +1 -0
  71. package/dist/messaging.service.d.ts +42 -0
  72. package/dist/messaging.service.d.ts.map +1 -0
  73. package/dist/messaging.service.js +109 -0
  74. package/dist/messaging.service.js.map +1 -0
  75. package/dist/messaging.service.test.d.ts +2 -0
  76. package/dist/messaging.service.test.d.ts.map +1 -0
  77. package/dist/messaging.service.test.js +163 -0
  78. package/dist/messaging.service.test.js.map +1 -0
  79. package/dist/store/conversation-context.interface.d.ts +17 -0
  80. package/dist/store/conversation-context.interface.d.ts.map +1 -0
  81. package/dist/store/conversation-context.interface.js +7 -0
  82. package/dist/store/conversation-context.interface.js.map +1 -0
  83. package/dist/store/memory-conversation-context.d.ts +11 -0
  84. package/dist/store/memory-conversation-context.d.ts.map +1 -0
  85. package/dist/store/memory-conversation-context.js +22 -0
  86. package/dist/store/memory-conversation-context.js.map +1 -0
  87. package/dist/store/memory-conversation-context.test.d.ts +2 -0
  88. package/dist/store/memory-conversation-context.test.d.ts.map +1 -0
  89. package/dist/store/memory-conversation-context.test.js +69 -0
  90. package/dist/store/memory-conversation-context.test.js.map +1 -0
  91. package/dist/store/redis-conversation-context.d.ts +24 -0
  92. package/dist/store/redis-conversation-context.d.ts.map +1 -0
  93. package/dist/store/redis-conversation-context.js +37 -0
  94. package/dist/store/redis-conversation-context.js.map +1 -0
  95. package/dist/store/redis-conversation-context.test.d.ts +2 -0
  96. package/dist/store/redis-conversation-context.test.d.ts.map +1 -0
  97. package/dist/store/redis-conversation-context.test.js +85 -0
  98. package/dist/store/redis-conversation-context.test.js.map +1 -0
  99. package/dist/types/message.types.d.ts +55 -0
  100. package/dist/types/message.types.d.ts.map +1 -0
  101. package/dist/types/message.types.js +7 -0
  102. package/dist/types/message.types.js.map +1 -0
  103. package/dist/types/response-handler.types.d.ts +47 -0
  104. package/dist/types/response-handler.types.d.ts.map +1 -0
  105. package/dist/types/response-handler.types.js +3 -0
  106. package/dist/types/response-handler.types.js.map +1 -0
  107. package/package.json +88 -0
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * RedisConversationContextStore tests
5
+ */
6
+ const redis_conversation_context_1 = require("./redis-conversation-context");
7
+ describe('RedisConversationContextStore', () => {
8
+ let store;
9
+ let mockClient;
10
+ beforeEach(() => {
11
+ mockClient = {
12
+ data: new Map(),
13
+ get: jest.fn(async (k) => mockClient.data.get(k) ?? null),
14
+ setex: jest.fn(async (k, _t, v) => {
15
+ mockClient.data.set(k, v);
16
+ return 'OK';
17
+ }),
18
+ del: jest.fn(async (k) => {
19
+ const had = mockClient.data.has(k);
20
+ mockClient.data.delete(k);
21
+ return had ? 1 : 0;
22
+ }),
23
+ };
24
+ store = new redis_conversation_context_1.RedisConversationContextStore({ client: mockClient, ttlSeconds: 3600 });
25
+ });
26
+ describe('getTurns', () => {
27
+ it('returns empty array when key does not exist', async () => {
28
+ const turns = await store.getTurns('s1');
29
+ expect(turns).toEqual([]);
30
+ expect(mockClient.get).toHaveBeenCalledWith('messaging:context:s1');
31
+ });
32
+ it('returns parsed turns from Redis', async () => {
33
+ const stored = JSON.stringify([
34
+ { role: 'user', content: 'Hi' },
35
+ { role: 'assistant', content: 'Hello!' },
36
+ ]);
37
+ mockClient.data.set('messaging:context:s1', stored);
38
+ const turns = await store.getTurns('s1');
39
+ expect(turns).toEqual([
40
+ { role: 'user', content: 'Hi' },
41
+ { role: 'assistant', content: 'Hello!' },
42
+ ]);
43
+ });
44
+ it('returns empty array on invalid JSON', async () => {
45
+ mockClient.data.set('messaging:context:s1', 'invalid-json');
46
+ const turns = await store.getTurns('s1');
47
+ expect(turns).toEqual([]);
48
+ });
49
+ });
50
+ describe('appendTurn', () => {
51
+ it('appends turn and persists to Redis', async () => {
52
+ await store.appendTurn('s1', { role: 'user', content: 'Hi' });
53
+ await store.appendTurn('s1', { role: 'assistant', content: 'Hello!' });
54
+ const stored = mockClient.data.get('messaging:context:s1');
55
+ expect(stored).toBeDefined();
56
+ const turns = JSON.parse(stored);
57
+ expect(turns).toHaveLength(2);
58
+ expect(turns[0]).toEqual({ role: 'user', content: 'Hi' });
59
+ expect(turns[1]).toEqual({ role: 'assistant', content: 'Hello!' });
60
+ });
61
+ it('trims to maxTurns*2 when exceeded', async () => {
62
+ for (let i = 0; i < 25; i++) {
63
+ await store.appendTurn('s1', { role: i % 2 === 0 ? 'user' : 'assistant', content: `msg${i}` }, 10);
64
+ }
65
+ const stored = mockClient.data.get('messaging:context:s1');
66
+ const turns = JSON.parse(stored);
67
+ expect(turns.length).toBeLessThanOrEqual(20);
68
+ });
69
+ it('uses default TTL when not provided', async () => {
70
+ const storeDefault = new redis_conversation_context_1.RedisConversationContextStore({ client: mockClient });
71
+ await storeDefault.appendTurn('s1', { role: 'user', content: 'Hi' });
72
+ expect(mockClient.setex).toHaveBeenCalledWith('messaging:context:s1', 86400, expect.any(String));
73
+ });
74
+ });
75
+ describe('clearSession', () => {
76
+ it('deletes key from Redis', async () => {
77
+ await store.appendTurn('s1', { role: 'user', content: 'Hi' });
78
+ await store.clearSession('s1');
79
+ expect(mockClient.del).toHaveBeenCalledWith('messaging:context:s1');
80
+ const turns = await store.getTurns('s1');
81
+ expect(turns).toEqual([]);
82
+ });
83
+ });
84
+ });
85
+ //# sourceMappingURL=redis-conversation-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-conversation-context.test.js","sourceRoot":"","sources":["../../src/store/redis-conversation-context.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @hazeljs/messaging - Core message types
3
+ * Channel-agnostic normalized format for multichannel bots
4
+ */
5
+ /** Supported messaging channels */
6
+ export type MessagingChannel = 'telegram' | 'whatsapp' | 'viber' | 'slack' | 'custom';
7
+ /** Normalized incoming message - same structure regardless of channel */
8
+ export interface IncomingMessage {
9
+ /** Unique message ID */
10
+ id: string;
11
+ /** Channel source */
12
+ channel: MessagingChannel;
13
+ /** Channel-specific conversation/chat ID */
14
+ conversationId: string;
15
+ /** User/sender identifier (channel-specific) */
16
+ userId: string;
17
+ /** Display name when available */
18
+ userName?: string;
19
+ /** Message text content */
20
+ text: string;
21
+ /** Raw payload from channel (for advanced use) */
22
+ rawPayload?: unknown;
23
+ /** Timestamp */
24
+ timestamp: Date;
25
+ /** Session/thread identifier for context */
26
+ sessionId?: string;
27
+ /** Optional metadata */
28
+ metadata?: Record<string, unknown>;
29
+ }
30
+ /** Normalized outgoing message */
31
+ export interface OutgoingMessage {
32
+ /** Target conversation ID */
33
+ conversationId: string;
34
+ /** Response text */
35
+ text: string;
36
+ /** Optional reply to specific message */
37
+ replyToMessageId?: string;
38
+ /** Optional metadata */
39
+ metadata?: Record<string, unknown>;
40
+ }
41
+ /** Channel adapter - receives raw webhook, produces IncomingMessage; sends OutgoingMessage */
42
+ export interface IChannelAdapter {
43
+ readonly channel: MessagingChannel;
44
+ /** Parse webhook payload into IncomingMessage */
45
+ parseIncoming(payload: unknown): IncomingMessage | IncomingMessage[] | null;
46
+ /** Send response to the channel */
47
+ send(message: OutgoingMessage): Promise<void>;
48
+ /** Optional: verify webhook (e.g. signature validation) */
49
+ verifyWebhook?(payload: unknown, headers?: Record<string, string>): boolean;
50
+ }
51
+ /** Handler for incoming messages - receives normalized message, returns response text */
52
+ export type MessageHandler = (message: IncomingMessage) => Promise<string> | string;
53
+ /** LLM response mode */
54
+ export type ResponseMode = 'llm' | 'agent' | 'custom';
55
+ //# sourceMappingURL=message.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.types.d.ts","sourceRoot":"","sources":["../../src/types/message.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtF,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,kCAAkC;AAClC,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,8FAA8F;AAC9F,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,iDAAiD;IACjD,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,GAAG,eAAe,EAAE,GAAG,IAAI,CAAC;IAC5E,mCAAmC;IACnC,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,2DAA2D;IAC3D,aAAa,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;CAC7E;AAED,yFAAyF;AACzF,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEpF,wBAAwB;AACxB,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * @hazeljs/messaging - Core message types
4
+ * Channel-agnostic normalized format for multichannel bots
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=message.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.types.js","sourceRoot":"","sources":["../../src/types/message.types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Response handler types - for Agent, RAG, and external integrations
3
+ */
4
+ import type { IncomingMessage } from './message.types';
5
+ import type { ConversationTurn } from '../store/conversation-context.interface';
6
+ /** Minimal RAG search interface - compatible with @hazeljs/rag RAGService */
7
+ export interface IRAGSearch {
8
+ search(query: string, options?: {
9
+ topK?: number;
10
+ minScore?: number;
11
+ }): Promise<Array<{
12
+ id?: string;
13
+ content: string;
14
+ score?: number;
15
+ metadata?: Record<string, unknown>;
16
+ }>>;
17
+ }
18
+ /** Result from agent/external handler - can include sources for citations */
19
+ export interface AgentHandlerResult {
20
+ response: string;
21
+ sources?: Array<{
22
+ id?: string;
23
+ content: string;
24
+ score?: number;
25
+ metadata?: Record<string, unknown>;
26
+ }>;
27
+ }
28
+ /** Input for agent handler - CSR-style integration */
29
+ export interface AgentHandlerInput {
30
+ message: IncomingMessage;
31
+ sessionId: string;
32
+ conversationTurns: ConversationTurn[];
33
+ }
34
+ /**
35
+ * Agent handler - wire your CSRService, AgentRuntime, or custom logic.
36
+ * Return response string or { response, sources }.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * agentHandler: async ({ message, sessionId }) => {
41
+ * const result = await csrService.chat(message.text, sessionId, message.userId);
42
+ * return { response: result.response, sources: result.sources };
43
+ * }
44
+ * ```
45
+ */
46
+ export type AgentHandler = (input: AgentHandlerInput) => Promise<string | AgentHandlerResult>;
47
+ //# sourceMappingURL=response-handler.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-handler.types.d.ts","sourceRoot":"","sources":["../../src/types/response-handler.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEhF,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CACR,KAAK,CAAC;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAC5F,CAAC;CACH;AAED,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,CAAC,CAAC;CACJ;AAED,sDAAsD;AACtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=response-handler.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-handler.types.js","sourceRoot":"","sources":["../../src/types/response-handler.types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@hazeljs/messaging",
3
+ "version": "0.2.0-beta.30",
4
+ "description": "Multichannel messaging for HazelJS - WhatsApp, Telegram, Viber with LLM-powered bot responses",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc --skipLibCheck",
12
+ "clean": "rm -rf dist",
13
+ "lint": "eslint src --ext .ts",
14
+ "lint:fix": "eslint src --ext .ts --fix",
15
+ "test": "jest --coverage --passWithNoTests",
16
+ "test:watch": "jest --watch"
17
+ },
18
+ "keywords": [
19
+ "hazeljs",
20
+ "messaging",
21
+ "whatsapp",
22
+ "telegram",
23
+ "viber",
24
+ "bot",
25
+ "llm",
26
+ "ai-chatbot"
27
+ ],
28
+ "author": "Muhammad Arslan <muhammad.arslan@hazeljs.com>",
29
+ "license": "Apache-2.0",
30
+ "bugs": {
31
+ "url": "https://github.com/hazeljs/hazel-js/issues"
32
+ },
33
+ "homepage": "https://hazeljs.com",
34
+ "dependencies": {
35
+ "reflect-metadata": "^0.2.1",
36
+ "telegraf": "^4.16.3"
37
+ },
38
+ "peerDependencies": {
39
+ "@hazeljs/ai": ">=0.2.0-beta.0",
40
+ "@hazeljs/core": ">=0.2.0-beta.0",
41
+ "@hazeljs/kafka": ">=0.2.0-beta.0",
42
+ "@hazeljs/rag": ">=0.2.0-beta.0",
43
+ "ioredis": ">=5.0.0",
44
+ "viber-bot": ">=1.0.0"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "@hazeljs/kafka": {
48
+ "optional": true,
49
+ "description": "Required for Kafka async processing - npm install @hazeljs/kafka"
50
+ },
51
+ "ioredis": {
52
+ "optional": true,
53
+ "description": "Required for Redis context store - npm install ioredis"
54
+ },
55
+ "viber-bot": {
56
+ "optional": true,
57
+ "description": "Required for Viber channel - npm install viber-bot"
58
+ },
59
+ "@hazeljs/agent": {
60
+ "optional": true,
61
+ "description": "Required for agent-based bot responses"
62
+ },
63
+ "@hazeljs/rag": {
64
+ "optional": true,
65
+ "description": "Required for RAG-enhanced responses"
66
+ },
67
+ "@hazeljs/queue": {
68
+ "optional": true,
69
+ "description": "Required for async message processing"
70
+ }
71
+ },
72
+ "devDependencies": {
73
+ "@types/jest": "^29.5.11",
74
+ "@types/node": "^20.17.50",
75
+ "jest": "^29.7.0",
76
+ "ts-jest": "^29.1.2",
77
+ "typescript": "^5.3.3"
78
+ },
79
+ "publishConfig": {
80
+ "access": "public"
81
+ },
82
+ "repository": {
83
+ "type": "git",
84
+ "url": "https://github.com/hazel-js/hazeljs.git",
85
+ "directory": "packages/messaging"
86
+ },
87
+ "gitHead": "8140fd5f0a3588dff08b0051ff63a8598f657263"
88
+ }