@auxiora/channels 1.0.0 → 1.3.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.
- package/dist/adapters/bluebubbles.d.ts +0 -1
- package/dist/adapters/bluebubbles.d.ts.map +1 -1
- package/dist/adapters/bluebubbles.js +2 -24
- package/dist/adapters/bluebubbles.js.map +1 -1
- package/dist/adapters/discord.d.ts +2 -1
- package/dist/adapters/discord.d.ts.map +1 -1
- package/dist/adapters/discord.js +20 -25
- package/dist/adapters/discord.js.map +1 -1
- package/dist/adapters/googlechat.d.ts +0 -1
- package/dist/adapters/googlechat.d.ts.map +1 -1
- package/dist/adapters/googlechat.js +2 -24
- package/dist/adapters/googlechat.js.map +1 -1
- package/dist/adapters/matrix.d.ts +0 -1
- package/dist/adapters/matrix.d.ts.map +1 -1
- package/dist/adapters/matrix.js +2 -24
- package/dist/adapters/matrix.js.map +1 -1
- package/dist/adapters/signal.d.ts +0 -1
- package/dist/adapters/signal.d.ts.map +1 -1
- package/dist/adapters/signal.js +2 -24
- package/dist/adapters/signal.js.map +1 -1
- package/dist/adapters/slack.d.ts +1 -1
- package/dist/adapters/slack.d.ts.map +1 -1
- package/dist/adapters/slack.js +12 -21
- package/dist/adapters/slack.js.map +1 -1
- package/dist/adapters/teams.d.ts +0 -1
- package/dist/adapters/teams.d.ts.map +1 -1
- package/dist/adapters/teams.js +2 -24
- package/dist/adapters/teams.js.map +1 -1
- package/dist/adapters/telegram.d.ts +1 -1
- package/dist/adapters/telegram.d.ts.map +1 -1
- package/dist/adapters/telegram.js +9 -21
- package/dist/adapters/telegram.js.map +1 -1
- package/dist/adapters/twilio.d.ts +0 -1
- package/dist/adapters/twilio.d.ts.map +1 -1
- package/dist/adapters/twilio.js +2 -24
- package/dist/adapters/twilio.js.map +1 -1
- package/dist/adapters/whatsapp.d.ts +0 -1
- package/dist/adapters/whatsapp.d.ts.map +1 -1
- package/dist/adapters/whatsapp.js +2 -24
- package/dist/adapters/whatsapp.js.map +1 -1
- package/dist/adapters/zalo.d.ts +0 -1
- package/dist/adapters/zalo.d.ts.map +1 -1
- package/dist/adapters/zalo.js +2 -24
- package/dist/adapters/zalo.js.map +1 -1
- package/dist/chunk.d.ts +14 -0
- package/dist/chunk.d.ts.map +1 -0
- package/dist/chunk.js +123 -0
- package/dist/chunk.js.map +1 -0
- package/dist/draft-stream-loop.d.ts +28 -0
- package/dist/draft-stream-loop.d.ts.map +1 -0
- package/dist/draft-stream-loop.js +80 -0
- package/dist/draft-stream-loop.js.map +1 -0
- package/dist/inbound-dedup.d.ts +17 -0
- package/dist/inbound-dedup.d.ts.map +1 -0
- package/dist/inbound-dedup.js +54 -0
- package/dist/inbound-dedup.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/manager.d.ts +12 -0
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +35 -0
- package/dist/manager.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +10 -4
- package/src/adapters/bluebubbles.ts +0 -294
- package/src/adapters/discord.ts +0 -253
- package/src/adapters/email.ts +0 -457
- package/src/adapters/googlechat.ts +0 -364
- package/src/adapters/matrix.ts +0 -376
- package/src/adapters/signal.ts +0 -313
- package/src/adapters/slack.ts +0 -252
- package/src/adapters/teams.ts +0 -320
- package/src/adapters/telegram.ts +0 -208
- package/src/adapters/twilio.ts +0 -256
- package/src/adapters/whatsapp.ts +0 -342
- package/src/adapters/zalo.ts +0 -319
- package/src/index.ts +0 -78
- package/src/manager.ts +0 -180
- package/src/types.ts +0 -84
- package/tests/bluebubbles.test.ts +0 -438
- package/tests/email.test.ts +0 -136
- package/tests/googlechat.test.ts +0 -439
- package/tests/matrix.test.ts +0 -564
- package/tests/signal.test.ts +0 -404
- package/tests/slack.test.ts +0 -343
- package/tests/teams.test.ts +0 -429
- package/tests/twilio.test.ts +0 -269
- package/tests/whatsapp.test.ts +0 -530
- package/tests/zalo.test.ts +0 -499
- package/tsconfig.json +0 -8
- package/tsconfig.tsbuildinfo +0 -1
package/dist/chunk.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown-aware text chunking for channel adapters.
|
|
3
|
+
*
|
|
4
|
+
* Splitting priority:
|
|
5
|
+
* 1. If text fits, return as-is
|
|
6
|
+
* 2. Never split inside fenced code blocks (find closing fence first)
|
|
7
|
+
* 3. Prefer paragraph boundaries (\n\n)
|
|
8
|
+
* 4. Fall back to newline boundaries (\n)
|
|
9
|
+
* 5. Fall back to space boundaries
|
|
10
|
+
* 6. Hard cut at maxLength
|
|
11
|
+
* 7. Oversized code blocks split at newlines within the block
|
|
12
|
+
*/
|
|
13
|
+
const LINK_RE = /\[[^\]]*\]\([^)]*\)/g;
|
|
14
|
+
export function chunkMarkdown(text, maxLength) {
|
|
15
|
+
if (text.length <= maxLength) {
|
|
16
|
+
return [text];
|
|
17
|
+
}
|
|
18
|
+
const chunks = [];
|
|
19
|
+
let remaining = text;
|
|
20
|
+
while (remaining.length > 0) {
|
|
21
|
+
if (remaining.length <= maxLength) {
|
|
22
|
+
chunks.push(remaining);
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
// Check if we are at a fenced code block
|
|
26
|
+
const fenceMatch = remaining.match(/^```[^\n]*\n/);
|
|
27
|
+
if (fenceMatch) {
|
|
28
|
+
const closeIndex = remaining.indexOf('\n```', fenceMatch[0].length);
|
|
29
|
+
if (closeIndex !== -1) {
|
|
30
|
+
const blockEnd = closeIndex + 4;
|
|
31
|
+
const lineEnd = remaining.indexOf('\n', blockEnd);
|
|
32
|
+
const fullBlockEnd = lineEnd === -1 ? remaining.length : lineEnd;
|
|
33
|
+
if (fullBlockEnd <= maxLength) {
|
|
34
|
+
chunks.push(remaining.slice(0, fullBlockEnd).trimEnd());
|
|
35
|
+
remaining = remaining.slice(fullBlockEnd).replace(/^\n+/, '');
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const blockText = remaining.slice(0, fullBlockEnd);
|
|
39
|
+
chunks.push(...splitCodeBlock(blockText, maxLength));
|
|
40
|
+
remaining = remaining.slice(fullBlockEnd).replace(/^\n+/, '');
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const breakPoint = findBreakPoint(remaining, maxLength);
|
|
45
|
+
chunks.push(remaining.slice(0, breakPoint).trimEnd());
|
|
46
|
+
remaining = remaining.slice(breakPoint).replace(/^\n+/, '').trimStart();
|
|
47
|
+
}
|
|
48
|
+
return chunks;
|
|
49
|
+
}
|
|
50
|
+
function findBreakPoint(text, maxLength) {
|
|
51
|
+
const window = text.slice(0, maxLength);
|
|
52
|
+
// Check for a fenced code block starting within the window
|
|
53
|
+
const fenceStart = window.search(/\n```[^\n]*\n/);
|
|
54
|
+
if (fenceStart !== -1) {
|
|
55
|
+
const afterOpen = text.indexOf('\n', fenceStart + 1);
|
|
56
|
+
if (afterOpen !== -1) {
|
|
57
|
+
const closeIdx = text.indexOf('\n```', afterOpen);
|
|
58
|
+
if (closeIdx !== -1 && closeIdx < maxLength) {
|
|
59
|
+
const lineEnd = text.indexOf('\n', closeIdx + 4);
|
|
60
|
+
const end = lineEnd === -1 ? closeIdx + 4 : lineEnd;
|
|
61
|
+
if (end <= maxLength) {
|
|
62
|
+
return end;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (fenceStart > 0) {
|
|
67
|
+
return fenceStart;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Try paragraph boundary
|
|
71
|
+
let bp = window.lastIndexOf('\n\n');
|
|
72
|
+
if (bp > maxLength / 4) {
|
|
73
|
+
return bp;
|
|
74
|
+
}
|
|
75
|
+
// Try newline boundary
|
|
76
|
+
bp = window.lastIndexOf('\n');
|
|
77
|
+
if (bp > maxLength / 4) {
|
|
78
|
+
if (!isInsideLink(text, bp)) {
|
|
79
|
+
return bp;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Try space boundary
|
|
83
|
+
bp = window.lastIndexOf(' ');
|
|
84
|
+
if (bp > maxLength / 4) {
|
|
85
|
+
if (!isInsideLink(text, bp)) {
|
|
86
|
+
return bp;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Hard cut
|
|
90
|
+
return maxLength;
|
|
91
|
+
}
|
|
92
|
+
function isInsideLink(text, position) {
|
|
93
|
+
for (const match of text.matchAll(LINK_RE)) {
|
|
94
|
+
const start = match.index;
|
|
95
|
+
const end = start + match[0].length;
|
|
96
|
+
if (position > start && position < end) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
if (start > position)
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
function splitCodeBlock(block, maxLength) {
|
|
105
|
+
const lines = block.split('\n');
|
|
106
|
+
const chunks = [];
|
|
107
|
+
let current = '';
|
|
108
|
+
for (const line of lines) {
|
|
109
|
+
const candidate = current ? current + '\n' + line : line;
|
|
110
|
+
if (candidate.length > maxLength && current) {
|
|
111
|
+
chunks.push(current);
|
|
112
|
+
current = line;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
current = candidate;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (current) {
|
|
119
|
+
chunks.push(current);
|
|
120
|
+
}
|
|
121
|
+
return chunks;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../src/chunk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel-agnostic throttled send/edit loop for draft streaming.
|
|
3
|
+
*
|
|
4
|
+
* Sends the first chunk immediately, then throttles subsequent updates.
|
|
5
|
+
* Only one API call is in-flight at a time. Latest text wins (coalescing).
|
|
6
|
+
*/
|
|
7
|
+
export declare class DraftStreamLoop {
|
|
8
|
+
private readonly sendOrEdit;
|
|
9
|
+
private pendingText;
|
|
10
|
+
private inFlightPromise;
|
|
11
|
+
private timer;
|
|
12
|
+
private lastSentAt;
|
|
13
|
+
private readonly throttleMs;
|
|
14
|
+
constructor(sendOrEdit: (text: string) => Promise<boolean>, overrides?: {
|
|
15
|
+
coalescingIdleMs?: number;
|
|
16
|
+
typingDelayMs?: number;
|
|
17
|
+
} | number);
|
|
18
|
+
/** Set the latest full text to display. Schedules or triggers a flush. */
|
|
19
|
+
update(text: string): void;
|
|
20
|
+
/** Force delivery of pending text. Waits for in-flight, then fires pending. */
|
|
21
|
+
flush(): Promise<void>;
|
|
22
|
+
/** Cancel timer and clear pending text. */
|
|
23
|
+
stop(): void;
|
|
24
|
+
private scheduleFlush;
|
|
25
|
+
private doSend;
|
|
26
|
+
private clearTimer;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=draft-stream-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-stream-loop.d.ts","sourceRoot":"","sources":["../src/draft-stream-loop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGjB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAC/D,SAAS,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAO5E,0EAA0E;IAC1E,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK1B,+EAA+E;IACzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,2CAA2C;IAC3C,IAAI,IAAI,IAAI;IAKZ,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,MAAM;IA4Bd,OAAO,CAAC,UAAU;CAMnB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel-agnostic throttled send/edit loop for draft streaming.
|
|
3
|
+
*
|
|
4
|
+
* Sends the first chunk immediately, then throttles subsequent updates.
|
|
5
|
+
* Only one API call is in-flight at a time. Latest text wins (coalescing).
|
|
6
|
+
*/
|
|
7
|
+
export class DraftStreamLoop {
|
|
8
|
+
sendOrEdit;
|
|
9
|
+
pendingText = null;
|
|
10
|
+
inFlightPromise = null;
|
|
11
|
+
timer = null;
|
|
12
|
+
lastSentAt = 0;
|
|
13
|
+
throttleMs;
|
|
14
|
+
constructor(sendOrEdit, overrides) {
|
|
15
|
+
this.sendOrEdit = sendOrEdit;
|
|
16
|
+
this.throttleMs = typeof overrides === 'number'
|
|
17
|
+
? overrides
|
|
18
|
+
: overrides?.coalescingIdleMs ?? 1000;
|
|
19
|
+
}
|
|
20
|
+
/** Set the latest full text to display. Schedules or triggers a flush. */
|
|
21
|
+
update(text) {
|
|
22
|
+
this.pendingText = text;
|
|
23
|
+
this.scheduleFlush();
|
|
24
|
+
}
|
|
25
|
+
/** Force delivery of pending text. Waits for in-flight, then fires pending. */
|
|
26
|
+
async flush() {
|
|
27
|
+
this.clearTimer();
|
|
28
|
+
if (this.inFlightPromise) {
|
|
29
|
+
await this.inFlightPromise;
|
|
30
|
+
}
|
|
31
|
+
if (this.pendingText !== null) {
|
|
32
|
+
void this.doSend();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Cancel timer and clear pending text. */
|
|
36
|
+
stop() {
|
|
37
|
+
this.clearTimer();
|
|
38
|
+
this.pendingText = null;
|
|
39
|
+
}
|
|
40
|
+
scheduleFlush() {
|
|
41
|
+
if (this.inFlightPromise || this.timer)
|
|
42
|
+
return;
|
|
43
|
+
const elapsed = Date.now() - this.lastSentAt;
|
|
44
|
+
const delay = Math.max(0, this.throttleMs - elapsed);
|
|
45
|
+
this.timer = setTimeout(() => {
|
|
46
|
+
this.timer = null;
|
|
47
|
+
void this.doSend();
|
|
48
|
+
}, delay);
|
|
49
|
+
}
|
|
50
|
+
doSend() {
|
|
51
|
+
const text = this.pendingText;
|
|
52
|
+
if (text === null)
|
|
53
|
+
return Promise.resolve();
|
|
54
|
+
this.pendingText = null;
|
|
55
|
+
const p = this.sendOrEdit(text).then((ok) => {
|
|
56
|
+
if (!ok && this.pendingText === null) {
|
|
57
|
+
this.pendingText = text;
|
|
58
|
+
}
|
|
59
|
+
}, () => {
|
|
60
|
+
// Swallow errors
|
|
61
|
+
}).then(() => {
|
|
62
|
+
if (this.inFlightPromise === p) {
|
|
63
|
+
this.inFlightPromise = null;
|
|
64
|
+
this.lastSentAt = Date.now();
|
|
65
|
+
if (this.pendingText !== null) {
|
|
66
|
+
this.scheduleFlush();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
this.inFlightPromise = p;
|
|
71
|
+
return p;
|
|
72
|
+
}
|
|
73
|
+
clearTimer() {
|
|
74
|
+
if (this.timer) {
|
|
75
|
+
clearTimeout(this.timer);
|
|
76
|
+
this.timer = null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=draft-stream-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-stream-loop.js","sourceRoot":"","sources":["../src/draft-stream-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory TTL-based deduplication cache for inbound channel messages.
|
|
3
|
+
*
|
|
4
|
+
* Prevents duplicate processing when webhook platforms retry delivery.
|
|
5
|
+
* Key: channelType|channelId|messageId. Entries auto-expire after ttlMs.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Check if a message is a duplicate.
|
|
9
|
+
*
|
|
10
|
+
* Returns `true` if this exact channelType+channelId+messageId was seen
|
|
11
|
+
* within the TTL window. Returns `false` (and records the message) if new.
|
|
12
|
+
* Empty messageId always returns `false` (bypass dedup).
|
|
13
|
+
*/
|
|
14
|
+
export declare function isDuplicate(channelType: string, channelId: string, messageId: string): boolean;
|
|
15
|
+
/** Clear all cached entries. For testing. */
|
|
16
|
+
export declare function resetInboundDedup(): void;
|
|
17
|
+
//# sourceMappingURL=inbound-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-dedup.d.ts","sourceRoot":"","sources":["../src/inbound-dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4BH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAgB9F;AAED,6CAA6C;AAC7C,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory TTL-based deduplication cache for inbound channel messages.
|
|
3
|
+
*
|
|
4
|
+
* Prevents duplicate processing when webhook platforms retry delivery.
|
|
5
|
+
* Key: channelType|channelId|messageId. Entries auto-expire after ttlMs.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_TTL_MS = 20 * 60_000; // 20 minutes
|
|
8
|
+
const DEFAULT_MAX_SIZE = 5000;
|
|
9
|
+
const cache = new Map();
|
|
10
|
+
function buildKey(channelType, channelId, messageId) {
|
|
11
|
+
return `${channelType}|${channelId}|${messageId}`;
|
|
12
|
+
}
|
|
13
|
+
function evictExpired(now) {
|
|
14
|
+
for (const [key, insertedAt] of cache) {
|
|
15
|
+
if (now - insertedAt > DEFAULT_TTL_MS) {
|
|
16
|
+
cache.delete(key);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function evictOldest() {
|
|
21
|
+
if (cache.size <= DEFAULT_MAX_SIZE)
|
|
22
|
+
return;
|
|
23
|
+
// Map iterates in insertion order — first entry is oldest
|
|
24
|
+
const firstKey = cache.keys().next().value;
|
|
25
|
+
if (firstKey !== undefined) {
|
|
26
|
+
cache.delete(firstKey);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a message is a duplicate.
|
|
31
|
+
*
|
|
32
|
+
* Returns `true` if this exact channelType+channelId+messageId was seen
|
|
33
|
+
* within the TTL window. Returns `false` (and records the message) if new.
|
|
34
|
+
* Empty messageId always returns `false` (bypass dedup).
|
|
35
|
+
*/
|
|
36
|
+
export function isDuplicate(channelType, channelId, messageId) {
|
|
37
|
+
if (!messageId)
|
|
38
|
+
return false;
|
|
39
|
+
const now = Date.now();
|
|
40
|
+
evictExpired(now);
|
|
41
|
+
const key = buildKey(channelType, channelId, messageId);
|
|
42
|
+
const insertedAt = cache.get(key);
|
|
43
|
+
if (insertedAt !== undefined && now - insertedAt <= DEFAULT_TTL_MS) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
cache.set(key, now);
|
|
47
|
+
evictOldest();
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
/** Clear all cached entries. For testing. */
|
|
51
|
+
export function resetInboundDedup() {
|
|
52
|
+
cache.clear();
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=inbound-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-dedup.js","sourceRoot":"","sources":["../src/inbound-dedup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,aAAa;AACjD,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExC,SAAS,QAAQ,CAAC,WAAmB,EAAE,SAAiB,EAAE,SAAiB;IACzE,OAAO,GAAG,WAAW,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,KAAK,EAAE,CAAC;QACtC,IAAI,GAAG,GAAG,UAAU,GAAG,cAAc,EAAE,CAAC;YACtC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,KAAK,CAAC,IAAI,IAAI,gBAAgB;QAAE,OAAO;IAC3C,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAiB,EAAE,SAAiB;IACnF,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,YAAY,CAAC,GAAG,CAAC,CAAC;IAElB,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,UAAU,KAAK,SAAS,IAAI,GAAG,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpB,WAAW,EAAE,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,iBAAiB;IAC/B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,4 +12,6 @@ export { GoogleChatAdapter, type GoogleChatAdapterConfig, } from './adapters/goo
|
|
|
12
12
|
export { BlueBubblesAdapter, type BlueBubblesAdapterConfig, } from './adapters/bluebubbles.js';
|
|
13
13
|
export { ZaloAdapter, type ZaloAdapterConfig, } from './adapters/zalo.js';
|
|
14
14
|
export { ChannelManager, type ChannelManagerConfig, } from './manager.js';
|
|
15
|
+
export { isDuplicate, resetInboundDedup } from './inbound-dedup.js';
|
|
16
|
+
export { DraftStreamLoop } from './draft-stream-loop.js';
|
|
15
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,EACb,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,EAClB,KAAK,wBAAwB,GAC9B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,GACvB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -13,4 +13,8 @@ export { BlueBubblesAdapter, } from './adapters/bluebubbles.js';
|
|
|
13
13
|
export { ZaloAdapter, } from './adapters/zalo.js';
|
|
14
14
|
// Manager
|
|
15
15
|
export { ChannelManager, } from './manager.js';
|
|
16
|
+
// Dedup
|
|
17
|
+
export { isDuplicate, resetInboundDedup } from './inbound-dedup.js';
|
|
18
|
+
// Draft streaming
|
|
19
|
+
export { DraftStreamLoop } from './draft-stream-loop.js';
|
|
16
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,WAAW;AACX,OAAO,EACL,cAAc,GAEf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,aAAa,GAGd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,GAEnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAE5B,UAAU;AACV,OAAO,EACL,cAAc,GAEf,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,WAAW;AACX,OAAO,EACL,cAAc,GAEf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,aAAa,GAGd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,GAEd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,kBAAkB,GAEnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,WAAW,GAEZ,MAAM,oBAAoB,CAAC;AAE5B,UAAU;AACV,OAAO,EACL,cAAc,GAEf,MAAM,cAAc,CAAC;AAEtB,QAAQ;AACR,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEpE,kBAAkB;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/manager.d.ts
CHANGED
|
@@ -3,6 +3,11 @@ import { type DiscordAdapterConfig } from './adapters/discord.js';
|
|
|
3
3
|
import { type TelegramAdapterConfig } from './adapters/telegram.js';
|
|
4
4
|
import { type SlackAdapterConfig } from './adapters/slack.js';
|
|
5
5
|
import { type TwilioAdapterConfig } from './adapters/twilio.js';
|
|
6
|
+
import { type EmailAdapterConfig } from './adapters/email.js';
|
|
7
|
+
import { type MatrixAdapterConfig } from './adapters/matrix.js';
|
|
8
|
+
import { type SignalAdapterConfig } from './adapters/signal.js';
|
|
9
|
+
import { type TeamsAdapterConfig } from './adapters/teams.js';
|
|
10
|
+
import { type WhatsAppAdapterConfig } from './adapters/whatsapp.js';
|
|
6
11
|
import { type GoogleChatAdapterConfig } from './adapters/googlechat.js';
|
|
7
12
|
import { type BlueBubblesAdapterConfig } from './adapters/bluebubbles.js';
|
|
8
13
|
import { type ZaloAdapterConfig } from './adapters/zalo.js';
|
|
@@ -11,6 +16,11 @@ export interface ChannelManagerConfig {
|
|
|
11
16
|
telegram?: TelegramAdapterConfig;
|
|
12
17
|
slack?: SlackAdapterConfig;
|
|
13
18
|
twilio?: TwilioAdapterConfig;
|
|
19
|
+
email?: EmailAdapterConfig;
|
|
20
|
+
matrix?: MatrixAdapterConfig;
|
|
21
|
+
signal?: SignalAdapterConfig;
|
|
22
|
+
teams?: TeamsAdapterConfig;
|
|
23
|
+
whatsapp?: WhatsAppAdapterConfig;
|
|
14
24
|
googlechat?: GoogleChatAdapterConfig;
|
|
15
25
|
bluebubbles?: BlueBubblesAdapterConfig;
|
|
16
26
|
zalo?: ZaloAdapterConfig;
|
|
@@ -26,6 +36,8 @@ export declare class ChannelManager {
|
|
|
26
36
|
disconnect(type: ChannelType): Promise<void>;
|
|
27
37
|
send(channelType: ChannelType, channelId: string, message: OutboundMessage): Promise<SendResult>;
|
|
28
38
|
startTyping(channelType: ChannelType, channelId: string): Promise<() => void>;
|
|
39
|
+
editMessage(channelType: ChannelType, channelId: string, messageId: string, message: OutboundMessage): Promise<SendResult>;
|
|
40
|
+
getDefaultChannelId(channelType: ChannelType): string | undefined;
|
|
29
41
|
getAdapter<T extends ChannelAdapter>(type: ChannelType): T | undefined;
|
|
30
42
|
getConnectedChannels(): ChannelType[];
|
|
31
43
|
getConfiguredChannels(): ChannelType[];
|
package/dist/manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EAEX,cAAc,EACd,eAAe,EACf,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAsB,KAAK,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/manager.js
CHANGED
|
@@ -4,9 +4,15 @@ import { DiscordAdapter } from './adapters/discord.js';
|
|
|
4
4
|
import { TelegramAdapter } from './adapters/telegram.js';
|
|
5
5
|
import { SlackAdapter } from './adapters/slack.js';
|
|
6
6
|
import { TwilioAdapter } from './adapters/twilio.js';
|
|
7
|
+
import { EmailAdapter } from './adapters/email.js';
|
|
8
|
+
import { MatrixAdapter } from './adapters/matrix.js';
|
|
9
|
+
import { SignalAdapter } from './adapters/signal.js';
|
|
10
|
+
import { TeamsAdapter } from './adapters/teams.js';
|
|
11
|
+
import { WhatsAppAdapter } from './adapters/whatsapp.js';
|
|
7
12
|
import { GoogleChatAdapter } from './adapters/googlechat.js';
|
|
8
13
|
import { BlueBubblesAdapter } from './adapters/bluebubbles.js';
|
|
9
14
|
import { ZaloAdapter } from './adapters/zalo.js';
|
|
15
|
+
import { isDuplicate } from './inbound-dedup.js';
|
|
10
16
|
export class ChannelManager {
|
|
11
17
|
adapters = new Map();
|
|
12
18
|
messageHandler;
|
|
@@ -31,6 +37,21 @@ export class ChannelManager {
|
|
|
31
37
|
if (config.bluebubbles?.serverUrl && config.bluebubbles?.password) {
|
|
32
38
|
this.adapters.set('bluebubbles', new BlueBubblesAdapter(config.bluebubbles));
|
|
33
39
|
}
|
|
40
|
+
if (config.email?.imapHost && config.email?.smtpHost && config.email?.email && config.email?.password) {
|
|
41
|
+
this.adapters.set('email', new EmailAdapter(config.email));
|
|
42
|
+
}
|
|
43
|
+
if (config.matrix?.homeserverUrl && config.matrix?.accessToken) {
|
|
44
|
+
this.adapters.set('matrix', new MatrixAdapter(config.matrix));
|
|
45
|
+
}
|
|
46
|
+
if (config.signal?.signalCliEndpoint && config.signal?.phoneNumber) {
|
|
47
|
+
this.adapters.set('signal', new SignalAdapter(config.signal));
|
|
48
|
+
}
|
|
49
|
+
if (config.teams?.microsoftAppId && config.teams?.microsoftAppPassword) {
|
|
50
|
+
this.adapters.set('teams', new TeamsAdapter(config.teams));
|
|
51
|
+
}
|
|
52
|
+
if (config.whatsapp?.phoneNumberId && config.whatsapp?.accessToken && config.whatsapp?.verifyToken) {
|
|
53
|
+
this.adapters.set('whatsapp', new WhatsAppAdapter(config.whatsapp));
|
|
54
|
+
}
|
|
34
55
|
if (config.zalo?.oaAccessToken && config.zalo?.oaSecretKey) {
|
|
35
56
|
this.adapters.set('zalo', new ZaloAdapter(config.zalo));
|
|
36
57
|
}
|
|
@@ -40,6 +61,10 @@ export class ChannelManager {
|
|
|
40
61
|
try {
|
|
41
62
|
// Set up message handler
|
|
42
63
|
adapter.onMessage(async (message) => {
|
|
64
|
+
if (isDuplicate(message.channelType, message.channelId, message.id)) {
|
|
65
|
+
logger.debug(`Duplicate inbound dropped: ${message.channelType}:${message.id}`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
43
68
|
if (this.messageHandler) {
|
|
44
69
|
await this.messageHandler(message);
|
|
45
70
|
}
|
|
@@ -106,6 +131,16 @@ export class ChannelManager {
|
|
|
106
131
|
}
|
|
107
132
|
return adapter.startTyping(channelId);
|
|
108
133
|
}
|
|
134
|
+
async editMessage(channelType, channelId, messageId, message) {
|
|
135
|
+
const adapter = this.adapters.get(channelType);
|
|
136
|
+
if (!adapter?.editMessage || !adapter.isConnected()) {
|
|
137
|
+
return { success: false, error: `Edit not supported for ${channelType}` };
|
|
138
|
+
}
|
|
139
|
+
return adapter.editMessage(channelId, messageId, message);
|
|
140
|
+
}
|
|
141
|
+
getDefaultChannelId(channelType) {
|
|
142
|
+
return this.adapters.get(channelType)?.getDefaultChannelId?.();
|
|
143
|
+
}
|
|
109
144
|
getAdapter(type) {
|
|
110
145
|
return this.adapters.get(type);
|
|
111
146
|
}
|
package/dist/manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AASrC,OAAO,EAAE,cAAc,EAA6B,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,eAAe,EAA8B,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,YAAY,EAA2B,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAA4B,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAgC,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAiC,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,WAAW,EAA0B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -41,6 +41,8 @@ export interface ChannelAdapter {
|
|
|
41
41
|
isConnected(): boolean;
|
|
42
42
|
send(channelId: string, message: OutboundMessage): Promise<SendResult>;
|
|
43
43
|
startTyping?(channelId: string): Promise<() => void>;
|
|
44
|
+
editMessage?(channelId: string, messageId: string, message: OutboundMessage): Promise<SendResult>;
|
|
45
|
+
getDefaultChannelId?(): string | undefined;
|
|
44
46
|
onMessage(handler: (message: InboundMessage) => Promise<void>): void;
|
|
45
47
|
onError(handler: (error: Error) => void): void;
|
|
46
48
|
}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,CAAC;AAEjL,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE;QACX,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAGtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IAGvB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAGvE,WAAW,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAGrD,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrE,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,MAAM,CAAC,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@auxiora/channels",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Channel adapters for Discord, Telegram, Slack, and Twilio",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -17,13 +17,19 @@
|
|
|
17
17
|
"discord.js": "^14.18.0",
|
|
18
18
|
"grammy": "^1.35.0",
|
|
19
19
|
"twilio": "^5.6.0",
|
|
20
|
-
"@auxiora/
|
|
21
|
-
"@auxiora/
|
|
22
|
-
"@auxiora/
|
|
20
|
+
"@auxiora/logger": "1.3.0",
|
|
21
|
+
"@auxiora/core": "1.3.0",
|
|
22
|
+
"@auxiora/audit": "1.3.0"
|
|
23
23
|
},
|
|
24
24
|
"engines": {
|
|
25
25
|
"node": ">=22.0.0"
|
|
26
26
|
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist/"
|
|
32
|
+
],
|
|
27
33
|
"scripts": {
|
|
28
34
|
"build": "tsc",
|
|
29
35
|
"clean": "rm -rf dist",
|