@cogitator-ai/channels 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +349 -0
  2. package/dist/assistant-config.d.ts +92 -0
  3. package/dist/assistant-config.d.ts.map +1 -0
  4. package/dist/assistant-config.js +89 -0
  5. package/dist/assistant-config.js.map +1 -0
  6. package/dist/capabilities.d.ts +14 -0
  7. package/dist/capabilities.d.ts.map +1 -0
  8. package/dist/capabilities.js +28 -0
  9. package/dist/capabilities.js.map +1 -0
  10. package/dist/channels/discord.d.ts +26 -0
  11. package/dist/channels/discord.d.ts.map +1 -0
  12. package/dist/channels/discord.js +153 -0
  13. package/dist/channels/discord.js.map +1 -0
  14. package/dist/channels/slack.d.ts +23 -0
  15. package/dist/channels/slack.d.ts.map +1 -0
  16. package/dist/channels/slack.js +89 -0
  17. package/dist/channels/slack.js.map +1 -0
  18. package/dist/channels/telegram.d.ts +30 -0
  19. package/dist/channels/telegram.d.ts.map +1 -0
  20. package/dist/channels/telegram.js +236 -0
  21. package/dist/channels/telegram.js.map +1 -0
  22. package/dist/channels/terminal.d.ts +30 -0
  23. package/dist/channels/terminal.d.ts.map +1 -0
  24. package/dist/channels/terminal.js +110 -0
  25. package/dist/channels/terminal.js.map +1 -0
  26. package/dist/channels/webchat.d.ts +24 -0
  27. package/dist/channels/webchat.d.ts.map +1 -0
  28. package/dist/channels/webchat.js +106 -0
  29. package/dist/channels/webchat.js.map +1 -0
  30. package/dist/channels/whatsapp.d.ts +28 -0
  31. package/dist/channels/whatsapp.d.ts.map +1 -0
  32. package/dist/channels/whatsapp.js +117 -0
  33. package/dist/channels/whatsapp.js.map +1 -0
  34. package/dist/envelope.d.ts +4 -0
  35. package/dist/envelope.d.ts.map +1 -0
  36. package/dist/envelope.js +64 -0
  37. package/dist/envelope.js.map +1 -0
  38. package/dist/formatters/discord-chunker.d.ts +6 -0
  39. package/dist/formatters/discord-chunker.d.ts.map +1 -0
  40. package/dist/formatters/discord-chunker.js +169 -0
  41. package/dist/formatters/discord-chunker.js.map +1 -0
  42. package/dist/formatters/markdown.d.ts +5 -0
  43. package/dist/formatters/markdown.d.ts.map +1 -0
  44. package/dist/formatters/markdown.js +59 -0
  45. package/dist/formatters/markdown.js.map +1 -0
  46. package/dist/formatters/whatsapp-markdown.d.ts +2 -0
  47. package/dist/formatters/whatsapp-markdown.d.ts.map +1 -0
  48. package/dist/formatters/whatsapp-markdown.js +26 -0
  49. package/dist/formatters/whatsapp-markdown.js.map +1 -0
  50. package/dist/gateway.d.ts +38 -0
  51. package/dist/gateway.d.ts.map +1 -0
  52. package/dist/gateway.js +347 -0
  53. package/dist/gateway.js.map +1 -0
  54. package/dist/heartbeat.d.ts +28 -0
  55. package/dist/heartbeat.d.ts.map +1 -0
  56. package/dist/heartbeat.js +143 -0
  57. package/dist/heartbeat.js.map +1 -0
  58. package/dist/hooks.d.ts +4 -0
  59. package/dist/hooks.d.ts.map +1 -0
  60. package/dist/hooks.js +30 -0
  61. package/dist/hooks.js.map +1 -0
  62. package/dist/inbound-debounce.d.ts +13 -0
  63. package/dist/inbound-debounce.d.ts.map +1 -0
  64. package/dist/inbound-debounce.js +61 -0
  65. package/dist/inbound-debounce.js.map +1 -0
  66. package/dist/index.d.ts +54 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +33 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/media/deepgram-stt.d.ts +14 -0
  71. package/dist/media/deepgram-stt.d.ts.map +1 -0
  72. package/dist/media/deepgram-stt.js +30 -0
  73. package/dist/media/deepgram-stt.js.map +1 -0
  74. package/dist/media/index.d.ts +7 -0
  75. package/dist/media/index.d.ts.map +1 -0
  76. package/dist/media/index.js +5 -0
  77. package/dist/media/index.js.map +1 -0
  78. package/dist/media/media-processor.d.ts +20 -0
  79. package/dist/media/media-processor.d.ts.map +1 -0
  80. package/dist/media/media-processor.js +80 -0
  81. package/dist/media/media-processor.js.map +1 -0
  82. package/dist/media/whisper-api.d.ts +22 -0
  83. package/dist/media/whisper-api.d.ts.map +1 -0
  84. package/dist/media/whisper-api.js +53 -0
  85. package/dist/media/whisper-api.js.map +1 -0
  86. package/dist/media/whisper-local.d.ts +16 -0
  87. package/dist/media/whisper-local.d.ts.map +1 -0
  88. package/dist/media/whisper-local.js +155 -0
  89. package/dist/media/whisper-local.js.map +1 -0
  90. package/dist/media/whisper-tool.d.ts +4 -0
  91. package/dist/media/whisper-tool.d.ts.map +1 -0
  92. package/dist/media/whisper-tool.js +19 -0
  93. package/dist/media/whisper-tool.js.map +1 -0
  94. package/dist/message-queue.d.ts +17 -0
  95. package/dist/message-queue.d.ts.map +1 -0
  96. package/dist/message-queue.js +115 -0
  97. package/dist/message-queue.js.map +1 -0
  98. package/dist/middleware/auto-extract.d.ts +36 -0
  99. package/dist/middleware/auto-extract.d.ts.map +1 -0
  100. package/dist/middleware/auto-extract.js +73 -0
  101. package/dist/middleware/auto-extract.js.map +1 -0
  102. package/dist/middleware/dm-policy.d.ts +39 -0
  103. package/dist/middleware/dm-policy.d.ts.map +1 -0
  104. package/dist/middleware/dm-policy.js +177 -0
  105. package/dist/middleware/dm-policy.js.map +1 -0
  106. package/dist/middleware/owner-commands.d.ts +25 -0
  107. package/dist/middleware/owner-commands.d.ts.map +1 -0
  108. package/dist/middleware/owner-commands.js +131 -0
  109. package/dist/middleware/owner-commands.js.map +1 -0
  110. package/dist/middleware/pairing.d.ts +20 -0
  111. package/dist/middleware/pairing.d.ts.map +1 -0
  112. package/dist/middleware/pairing.js +70 -0
  113. package/dist/middleware/pairing.js.map +1 -0
  114. package/dist/middleware/rate-limit.d.ts +14 -0
  115. package/dist/middleware/rate-limit.d.ts.map +1 -0
  116. package/dist/middleware/rate-limit.js +31 -0
  117. package/dist/middleware/rate-limit.js.map +1 -0
  118. package/dist/runtime-builder.d.ts +42 -0
  119. package/dist/runtime-builder.d.ts.map +1 -0
  120. package/dist/runtime-builder.js +607 -0
  121. package/dist/runtime-builder.js.map +1 -0
  122. package/dist/simple-timer-store.d.ts +28 -0
  123. package/dist/simple-timer-store.d.ts.map +1 -0
  124. package/dist/simple-timer-store.js +129 -0
  125. package/dist/simple-timer-store.js.map +1 -0
  126. package/dist/status-reactions.d.ts +22 -0
  127. package/dist/status-reactions.d.ts.map +1 -0
  128. package/dist/status-reactions.js +86 -0
  129. package/dist/status-reactions.js.map +1 -0
  130. package/dist/stream-buffer.d.ts +31 -0
  131. package/dist/stream-buffer.d.ts.map +1 -0
  132. package/dist/stream-buffer.js +170 -0
  133. package/dist/stream-buffer.js.map +1 -0
  134. package/dist/tools/self-config.d.ts +9 -0
  135. package/dist/tools/self-config.d.ts.map +1 -0
  136. package/dist/tools/self-config.js +122 -0
  137. package/dist/tools/self-config.js.map +1 -0
  138. package/package.json +102 -0
@@ -0,0 +1,110 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { userInfo } from 'node:os';
3
+ export class TerminalChannel {
4
+ type = 'terminal';
5
+ handler = null;
6
+ rl = null;
7
+ msgCounter = 0;
8
+ lastLineCount = 0;
9
+ responding = false;
10
+ userName;
11
+ userId;
12
+ promptStr;
13
+ constructor(config = {}) {
14
+ this.userName = config.userName || userInfo().username;
15
+ this.userId = config.userId || 'owner';
16
+ this.promptStr = config.prompt || '> ';
17
+ }
18
+ onMessage(handler) {
19
+ this.handler = handler;
20
+ }
21
+ async start() {
22
+ if (!process.stdin.isTTY && !process.env.COGITATOR_FORCE_TERMINAL)
23
+ return;
24
+ this.rl = createInterface({
25
+ input: process.stdin,
26
+ output: process.stdout,
27
+ terminal: true,
28
+ });
29
+ this.rl.on('close', () => {
30
+ process.exit(0);
31
+ });
32
+ this.showPrompt();
33
+ }
34
+ async stop() {
35
+ if (this.rl) {
36
+ this.rl.close();
37
+ this.rl = null;
38
+ }
39
+ }
40
+ async sendText(_channelId, text, _options) {
41
+ const id = `term_${++this.msgCounter}`;
42
+ this.writeOutput(text);
43
+ this.responding = false;
44
+ this.showPrompt();
45
+ return id;
46
+ }
47
+ async editText(_channelId, _messageId, text) {
48
+ if (this.lastLineCount > 0) {
49
+ process.stdout.write(`\x1b[${this.lastLineCount}A\x1b[J`);
50
+ }
51
+ this.writeOutput(text);
52
+ }
53
+ async sendFile(_channelId, file) {
54
+ const label = file.filename || file.mimeType;
55
+ const url = file.url ? ` ${file.url}` : '';
56
+ process.stdout.write(` [${label}]${url}\n`);
57
+ }
58
+ async sendTyping() { }
59
+ writeOutput(text) {
60
+ const lines = text.split('\n');
61
+ this.lastLineCount = lines.length;
62
+ process.stdout.write(lines.join('\n') + '\n');
63
+ }
64
+ showPrompt() {
65
+ if (!this.rl || this.responding)
66
+ return;
67
+ this.rl.question(this.promptStr, (input) => {
68
+ void this.handleInput(input);
69
+ });
70
+ }
71
+ async handleInput(raw) {
72
+ const text = raw.trim();
73
+ if (!text) {
74
+ this.showPrompt();
75
+ return;
76
+ }
77
+ if (text === '/quit' || text === '/exit' || text === 'exit') {
78
+ await this.stop();
79
+ return;
80
+ }
81
+ if (!this.handler) {
82
+ this.showPrompt();
83
+ return;
84
+ }
85
+ this.responding = true;
86
+ this.lastLineCount = 0;
87
+ const msg = {
88
+ id: `in_${++this.msgCounter}`,
89
+ channelType: 'terminal',
90
+ channelId: 'terminal',
91
+ userId: this.userId,
92
+ userName: this.userName,
93
+ text,
94
+ raw: { text },
95
+ };
96
+ try {
97
+ await this.handler(msg);
98
+ }
99
+ catch (err) {
100
+ const errMsg = err instanceof Error ? err.message : String(err);
101
+ process.stdout.write(`Error: ${errMsg}\n`);
102
+ this.responding = false;
103
+ this.showPrompt();
104
+ }
105
+ }
106
+ }
107
+ export function terminalChannel(config) {
108
+ return new TerminalChannel(config);
109
+ }
110
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/channels/terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Channel, ChannelMessage, ChannelType, Attachment, SendOptions } from '@cogitator-ai/types';
2
+ export interface WebChatConfig {
3
+ port: number;
4
+ path?: string;
5
+ auth?: (token: string) => boolean;
6
+ }
7
+ export declare class WebChatChannel implements Channel {
8
+ private readonly config;
9
+ readonly type: ChannelType;
10
+ private handler;
11
+ private server;
12
+ private clients;
13
+ constructor(config: WebChatConfig);
14
+ onMessage(handler: (msg: ChannelMessage) => Promise<void>): void;
15
+ start(): Promise<void>;
16
+ stop(): Promise<void>;
17
+ sendText(channelId: string, text: string, _options?: SendOptions): Promise<string>;
18
+ editText(channelId: string, messageId: string, text: string): Promise<void>;
19
+ sendFile(channelId: string, file: Attachment): Promise<void>;
20
+ sendTyping(channelId: string): Promise<void>;
21
+ private onRawMessage;
22
+ }
23
+ export declare function webchatChannel(config: WebChatConfig): Channel;
24
+ //# sourceMappingURL=webchat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webchat.d.ts","sourceRoot":"","sources":["../../src/channels/webchat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAG7B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AASD,qBAAa,cAAe,YAAW,OAAO;IAMhC,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAa;IACvC,OAAO,CAAC,OAAO,CAAyD;IACxE,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAAoC;gBAEtB,MAAM,EAAE,aAAa;IAElD,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IASlF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5D,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAMpC,YAAY;CAuB3B;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAE7D"}
@@ -0,0 +1,106 @@
1
+ import { nanoid } from 'nanoid';
2
+ const WS_OPEN = 1;
3
+ export class WebChatChannel {
4
+ config;
5
+ type = 'webchat';
6
+ handler = null;
7
+ server = null;
8
+ clients = new Map();
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ onMessage(handler) {
13
+ this.handler = handler;
14
+ }
15
+ async start() {
16
+ const { WebSocketServer } = await import('ws');
17
+ const wss = new WebSocketServer({
18
+ port: this.config.port,
19
+ path: this.config.path ?? '/ws',
20
+ });
21
+ wss.on('connection', (ws, req) => {
22
+ const clientId = `webchat_${nanoid(8)}`;
23
+ if (this.config.auth) {
24
+ const url = new URL(req.url ?? '/', `http://localhost:${this.config.port}`);
25
+ const token = url.searchParams.get('token') ?? '';
26
+ if (!this.config.auth(token)) {
27
+ ws.send(JSON.stringify({ type: 'error', message: 'unauthorized' }));
28
+ return;
29
+ }
30
+ }
31
+ this.clients.set(clientId, ws);
32
+ ws.send(JSON.stringify({ type: 'connected', clientId }));
33
+ ws.on('message', (data) => {
34
+ void this.onRawMessage(clientId, data.toString());
35
+ });
36
+ ws.on('close', () => {
37
+ this.clients.delete(clientId);
38
+ });
39
+ });
40
+ this.server = wss;
41
+ }
42
+ async stop() {
43
+ if (this.server) {
44
+ this.server.close();
45
+ this.server = null;
46
+ }
47
+ this.clients.clear();
48
+ }
49
+ async sendText(channelId, text, _options) {
50
+ const client = this.clients.get(channelId);
51
+ if (client?.readyState !== WS_OPEN)
52
+ return '';
53
+ const messageId = `msg_${nanoid(8)}`;
54
+ client.send(JSON.stringify({ type: 'message', id: messageId, text }));
55
+ return messageId;
56
+ }
57
+ async editText(channelId, messageId, text) {
58
+ const client = this.clients.get(channelId);
59
+ if (client?.readyState !== WS_OPEN)
60
+ return;
61
+ client.send(JSON.stringify({ type: 'edit', id: messageId, text }));
62
+ }
63
+ async sendFile(channelId, file) {
64
+ const client = this.clients.get(channelId);
65
+ if (client?.readyState !== WS_OPEN)
66
+ return;
67
+ client.send(JSON.stringify({
68
+ type: 'file',
69
+ filename: file.filename,
70
+ mimeType: file.mimeType,
71
+ url: file.url,
72
+ }));
73
+ }
74
+ async sendTyping(channelId) {
75
+ const client = this.clients.get(channelId);
76
+ if (client?.readyState !== WS_OPEN)
77
+ return;
78
+ client.send(JSON.stringify({ type: 'typing' }));
79
+ }
80
+ async onRawMessage(clientId, raw) {
81
+ if (!this.handler)
82
+ return;
83
+ let parsed;
84
+ try {
85
+ parsed = JSON.parse(raw);
86
+ }
87
+ catch {
88
+ return;
89
+ }
90
+ if (!parsed.text)
91
+ return;
92
+ const msg = {
93
+ id: parsed.id ?? `in_${nanoid(8)}`,
94
+ channelType: 'webchat',
95
+ channelId: clientId,
96
+ userId: clientId,
97
+ text: parsed.text,
98
+ raw: parsed,
99
+ };
100
+ await this.handler(msg);
101
+ }
102
+ }
103
+ export function webchatChannel(config) {
104
+ return new WebChatChannel(config);
105
+ }
106
+ //# sourceMappingURL=webchat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webchat.js","sourceRoot":"","sources":["../../src/channels/webchat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Channel, ChannelMessage } from '@cogitator-ai/types';
2
+ export interface WhatsAppChannelConfig {
3
+ sessionPath?: string;
4
+ qrCallback?: (qr: string) => void;
5
+ printQr?: boolean;
6
+ }
7
+ type MessageHandler = (msg: ChannelMessage) => Promise<void>;
8
+ export declare class WhatsAppChannel implements Channel {
9
+ readonly type = "whatsapp";
10
+ private handler;
11
+ private sock;
12
+ private config;
13
+ constructor(config?: WhatsAppChannelConfig);
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ onMessage(handler: MessageHandler): void;
17
+ sendText(channelId: string, text: string): Promise<string>;
18
+ editText(channelId: string, messageId: string, text: string): Promise<void>;
19
+ sendFile(channelId: string, file: {
20
+ buffer?: Buffer;
21
+ mimeType: string;
22
+ filename?: string;
23
+ }): Promise<void>;
24
+ sendTyping(channelId: string): Promise<void>;
25
+ }
26
+ export declare function whatsappChannel(config?: WhatsAppChannelConfig): Channel;
27
+ export {};
28
+ //# sourceMappingURL=whatsapp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../src/channels/whatsapp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgCD,KAAK,cAAc,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7D,qBAAa,eAAgB,YAAW,OAAO;IAC7C,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,GAAE,qBAA0B;IAIxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwFtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIlC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO1D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3E,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,IAAI,CAAC;IAWV,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAInD;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAEvE"}
@@ -0,0 +1,117 @@
1
+ import { markdownToWhatsApp } from '../formatters/whatsapp-markdown';
2
+ export class WhatsAppChannel {
3
+ type = 'whatsapp';
4
+ handler = null;
5
+ sock = null;
6
+ config;
7
+ constructor(config = {}) {
8
+ this.config = config;
9
+ }
10
+ async start() {
11
+ let baileys;
12
+ try {
13
+ // @ts-expect-error optional peer dependency
14
+ baileys = await import('@whiskeysockets/baileys');
15
+ }
16
+ catch {
17
+ throw new Error('@whiskeysockets/baileys is required for WhatsApp. Install it: pnpm add @whiskeysockets/baileys');
18
+ }
19
+ const sessionPath = this.config.sessionPath ?? '.cogitator/whatsapp-session';
20
+ const { state, saveCreds } = await baileys.useMultiFileAuthState(sessionPath);
21
+ const sock = baileys.default({
22
+ auth: state,
23
+ printQRInTerminal: this.config.printQr ?? true,
24
+ });
25
+ this.sock = sock;
26
+ sock.ev.on('creds.update', saveCreds);
27
+ sock.ev.on('connection.update', (update) => {
28
+ const { connection, qr } = update;
29
+ if (qr && this.config.qrCallback) {
30
+ this.config.qrCallback(qr);
31
+ }
32
+ if (connection === 'close') {
33
+ const { lastDisconnect } = update;
34
+ const statusCode = lastDisconnect?.error?.output?.statusCode;
35
+ const loggedOut = statusCode === baileys.DisconnectReason.loggedOut;
36
+ if (!loggedOut) {
37
+ void this.start();
38
+ }
39
+ }
40
+ });
41
+ sock.ev.on('messages.upsert', (upsert) => {
42
+ const { messages, type } = upsert;
43
+ if (type !== 'notify')
44
+ return;
45
+ for (const msg of messages) {
46
+ if (msg.key.fromMe)
47
+ continue;
48
+ if (!msg.message)
49
+ continue;
50
+ const text = msg.message.conversation ?? msg.message.extendedTextMessage?.text ?? '';
51
+ if (!text)
52
+ continue;
53
+ const jid = msg.key.remoteJid ?? '';
54
+ const userId = msg.key.participant ?? jid;
55
+ const isGroup = jid.endsWith('@g.us');
56
+ const channelMsg = {
57
+ id: msg.key.id ?? '',
58
+ channelType: 'whatsapp',
59
+ channelId: jid,
60
+ userId: userId.split('@')[0],
61
+ userName: msg.pushName ?? userId.split('@')[0],
62
+ text,
63
+ raw: msg,
64
+ ...(isGroup ? { groupId: jid } : {}),
65
+ };
66
+ if (this.handler) {
67
+ void this.handler(channelMsg);
68
+ }
69
+ }
70
+ });
71
+ }
72
+ async stop() {
73
+ if (this.sock) {
74
+ this.sock.end();
75
+ this.sock = null;
76
+ }
77
+ }
78
+ onMessage(handler) {
79
+ this.handler = handler;
80
+ }
81
+ async sendText(channelId, text) {
82
+ if (!this.sock)
83
+ throw new Error('WhatsApp not connected');
84
+ const waText = markdownToWhatsApp(text);
85
+ const sent = await this.sock.sendMessage(channelId, { text: waText });
86
+ return sent.key.id ?? '';
87
+ }
88
+ async editText(channelId, messageId, text) {
89
+ if (!this.sock)
90
+ return;
91
+ const waText = markdownToWhatsApp(text);
92
+ await this.sock.sendMessage(channelId, {
93
+ text: waText,
94
+ edit: { key: { remoteJid: channelId, id: messageId } },
95
+ });
96
+ }
97
+ async sendFile(channelId, file) {
98
+ if (!this.sock)
99
+ throw new Error('WhatsApp not connected');
100
+ if (!file.buffer)
101
+ return;
102
+ await this.sock.sendMessage(channelId, {
103
+ document: file.buffer,
104
+ mimetype: file.mimeType,
105
+ fileName: file.filename ?? 'file',
106
+ });
107
+ }
108
+ async sendTyping(channelId) {
109
+ if (!this.sock)
110
+ return;
111
+ await this.sock.sendPresenceUpdate('composing', channelId);
112
+ }
113
+ }
114
+ export function whatsappChannel(config) {
115
+ return new WhatsAppChannel(config);
116
+ }
117
+ //# sourceMappingURL=whatsapp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../src/channels/whatsapp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ChannelMessage, EnvelopeConfig } from '@cogitator-ai/types';
2
+ export declare function formatElapsed(ms: number): string;
3
+ export declare function formatEnvelope(msg: ChannelMessage, config: EnvelopeConfig, previousTimestamp?: number): string;
4
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1E,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAqBhD;AAuBD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,cAAc,EACtB,iBAAiB,CAAC,EAAE,MAAM,GACzB,MAAM,CA4BR"}
@@ -0,0 +1,64 @@
1
+ export function formatElapsed(ms) {
2
+ if (ms < 0)
3
+ return '+0s';
4
+ const seconds = Math.floor(ms / 1000);
5
+ if (seconds < 60)
6
+ return `+${seconds}s`;
7
+ const minutes = Math.floor(seconds / 60);
8
+ const remainSec = seconds % 60;
9
+ if (minutes < 60) {
10
+ return remainSec > 0 ? `+${minutes}m${remainSec}s` : `+${minutes}m`;
11
+ }
12
+ const hours = Math.floor(minutes / 60);
13
+ const remainMin = minutes % 60;
14
+ if (hours < 24) {
15
+ return remainMin > 0 ? `+${hours}h${remainMin}m` : `+${hours}h`;
16
+ }
17
+ const days = Math.floor(hours / 24);
18
+ const remainHrs = hours % 24;
19
+ return remainHrs > 0 ? `+${days}d${remainHrs}h` : `+${days}d`;
20
+ }
21
+ function sanitize(str) {
22
+ return str.replace(/[[\]\n\r]/g, ' ').trim();
23
+ }
24
+ function formatTime(timestamp, timezone) {
25
+ const tz = timezone === 'local' ? undefined : (timezone ?? 'utc');
26
+ const opts = {
27
+ month: 'short',
28
+ day: 'numeric',
29
+ hour: '2-digit',
30
+ minute: '2-digit',
31
+ hour12: false,
32
+ };
33
+ if (tz && tz !== 'utc') {
34
+ opts.timeZone = tz;
35
+ }
36
+ else if (tz === 'utc') {
37
+ opts.timeZone = 'UTC';
38
+ }
39
+ return new Intl.DateTimeFormat('en-US', opts).format(new Date(timestamp));
40
+ }
41
+ export function formatEnvelope(msg, config, previousTimestamp) {
42
+ const parts = [];
43
+ const includeTimestamp = config.includeTimestamp ?? true;
44
+ if (includeTimestamp) {
45
+ parts.push(formatTime(Date.now(), config.timezone));
46
+ }
47
+ if (config.includeChannel !== false) {
48
+ parts.push(msg.channelType);
49
+ }
50
+ if (config.includeSender !== false && msg.userName) {
51
+ parts.push(sanitize(msg.userName));
52
+ }
53
+ if (config.includeChatType) {
54
+ parts.push(msg.groupId ? 'group' : 'DM');
55
+ }
56
+ const includeElapsed = config.includeElapsed ?? true;
57
+ if (includeElapsed && previousTimestamp !== undefined) {
58
+ const elapsed = Date.now() - previousTimestamp;
59
+ parts.push(formatElapsed(elapsed));
60
+ }
61
+ const header = `[${parts.join(' | ')}]`;
62
+ return `${header} ${msg.text}`;
63
+ }
64
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ChunkDiscordTextOpts {
2
+ maxChars?: number;
3
+ maxLines?: number;
4
+ }
5
+ export declare function chunkDiscordText(text: string, opts?: ChunkDiscordTextOpts): string[];
6
+ //# sourceMappingURL=discord-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-chunker.d.ts","sourceRoot":"","sources":["../../src/formatters/discord-chunker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAyGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,EAAE,CA0FxF"}