@jungjaehoon/mama-os 0.25.0 → 0.27.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/CHANGELOG.md +9 -0
- package/README.md +37 -17
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +8 -0
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/attachment-text-extractor.d.ts +2 -0
- package/dist/agent/attachment-text-extractor.d.ts.map +1 -0
- package/dist/agent/attachment-text-extractor.js +128 -0
- package/dist/agent/attachment-text-extractor.js.map +1 -0
- package/dist/agent/code-act/constants.d.ts.map +1 -1
- package/dist/agent/code-act/constants.js +17 -2
- package/dist/agent/code-act/constants.js.map +1 -1
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +107 -0
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/code-act/tool-policy.d.ts +9 -1
- package/dist/agent/code-act/tool-policy.d.ts.map +1 -1
- package/dist/agent/code-act/tool-policy.js +30 -1
- package/dist/agent/code-act/tool-policy.js.map +1 -1
- package/dist/agent/codex-app-server-process.d.ts +1 -0
- package/dist/agent/codex-app-server-process.d.ts.map +1 -1
- package/dist/agent/codex-app-server-process.js +16 -0
- package/dist/agent/codex-app-server-process.js.map +1 -1
- package/dist/agent/drive-tools.d.ts +55 -0
- package/dist/agent/drive-tools.d.ts.map +1 -0
- package/dist/agent/drive-tools.js +263 -0
- package/dist/agent/drive-tools.js.map +1 -0
- package/dist/agent/gateway-tool-executor.d.ts +11 -3
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +249 -19
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +9 -0
- package/dist/agent/image-translation-tools.d.ts +48 -0
- package/dist/agent/image-translation-tools.d.ts.map +1 -0
- package/dist/agent/image-translation-tools.js +274 -0
- package/dist/agent/image-translation-tools.js.map +1 -0
- package/dist/agent/role-manager.d.ts.map +1 -1
- package/dist/agent/role-manager.js +9 -1
- package/dist/agent/role-manager.js.map +1 -1
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +53 -0
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +22 -33
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +18 -8
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +12 -4
- package/dist/cli/config/types.js.map +1 -1
- package/dist/cli/runtime/envelope-bootstrap.d.ts.map +1 -1
- package/dist/cli/runtime/envelope-bootstrap.js +8 -1
- package/dist/cli/runtime/envelope-bootstrap.js.map +1 -1
- package/dist/connectors/drive/index.d.ts +1 -1
- package/dist/connectors/drive/index.d.ts.map +1 -1
- package/dist/connectors/drive/index.js +100 -56
- package/dist/connectors/drive/index.js.map +1 -1
- package/dist/connectors/framework/gws-utils.d.ts +3 -0
- package/dist/connectors/framework/gws-utils.d.ts.map +1 -1
- package/dist/connectors/framework/gws-utils.js +17 -0
- package/dist/connectors/framework/gws-utils.js.map +1 -1
- package/dist/envelope/enforcer.d.ts.map +1 -1
- package/dist/envelope/enforcer.js +18 -3
- package/dist/envelope/enforcer.js.map +1 -1
- package/dist/envelope/reactive-config.d.ts +1 -1
- package/dist/envelope/reactive-config.d.ts.map +1 -1
- package/dist/envelope/reactive-config.js +10 -2
- package/dist/envelope/reactive-config.js.map +1 -1
- package/dist/envelope/types.d.ts +1 -1
- package/dist/envelope/types.d.ts.map +1 -1
- package/dist/envelope/types.js.map +1 -1
- package/dist/gateways/message-router.d.ts +4 -0
- package/dist/gateways/message-router.d.ts.map +1 -1
- package/dist/gateways/message-router.js +433 -335
- package/dist/gateways/message-router.js.map +1 -1
- package/dist/gateways/session-store.d.ts +2 -0
- package/dist/gateways/session-store.d.ts.map +1 -1
- package/dist/gateways/session-store.js +41 -1
- package/dist/gateways/session-store.js.map +1 -1
- package/dist/gateways/telegram-media.d.ts +41 -0
- package/dist/gateways/telegram-media.d.ts.map +1 -0
- package/dist/gateways/telegram-media.js +242 -0
- package/dist/gateways/telegram-media.js.map +1 -0
- package/dist/gateways/telegram-message-ledger.d.ts +49 -0
- package/dist/gateways/telegram-message-ledger.d.ts.map +1 -0
- package/dist/gateways/telegram-message-ledger.js +266 -0
- package/dist/gateways/telegram-message-ledger.js.map +1 -0
- package/dist/gateways/telegram-response-presenter.d.ts +41 -0
- package/dist/gateways/telegram-response-presenter.d.ts.map +1 -0
- package/dist/gateways/telegram-response-presenter.js +250 -0
- package/dist/gateways/telegram-response-presenter.js.map +1 -0
- package/dist/gateways/telegram.d.ts +30 -7
- package/dist/gateways/telegram.d.ts.map +1 -1
- package/dist/gateways/telegram.js +444 -124
- package/dist/gateways/telegram.js.map +1 -1
- package/dist/gateways/types.d.ts +4 -2
- package/dist/gateways/types.d.ts.map +1 -1
- package/dist/operator/operator-interfaces.d.ts +1 -1
- package/dist/operator/operator-interfaces.d.ts.map +1 -1
- package/dist/operator/operator-trigger-loop.d.ts +12 -0
- package/dist/operator/operator-trigger-loop.d.ts.map +1 -1
- package/dist/operator/operator-trigger-loop.js +184 -38
- package/dist/operator/operator-trigger-loop.js.map +1 -1
- package/dist/operator/pending-report-store.d.ts +35 -0
- package/dist/operator/pending-report-store.d.ts.map +1 -0
- package/dist/operator/pending-report-store.js +155 -0
- package/dist/operator/pending-report-store.js.map +1 -0
- package/dist/operator/runtime-config.d.ts +10 -0
- package/dist/operator/runtime-config.d.ts.map +1 -0
- package/dist/operator/runtime-config.js +21 -0
- package/dist/operator/runtime-config.js.map +1 -0
- package/dist/operator/situation-report.d.ts +37 -0
- package/dist/operator/situation-report.d.ts.map +1 -1
- package/dist/operator/situation-report.js +122 -9
- package/dist/operator/situation-report.js.map +1 -1
- package/package.json +3 -1
- package/scripts/attachment/extract-office-text.js +179 -0
- package/scripts/attachment/extract-pdf-text.swift +36 -0
- package/scripts/image/fb-overlay.py +128 -0
- package/scripts/image/ocr-image.py +38 -0
- package/scripts/setup-ocr.js +120 -0
- package/templates/skills/image-translate.md +17 -22
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TelegramResponsePresenter = void 0;
|
|
4
|
+
exports.splitTelegramMessage = splitTelegramMessage;
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const DEFAULT_THROTTLE_MS = 800;
|
|
8
|
+
const DEFAULT_MAX_LENGTH = 4096;
|
|
9
|
+
const EMPTY_RESPONSE_MESSAGE = 'No response was generated.';
|
|
10
|
+
function stripLeadingReasoningDecoration(text) {
|
|
11
|
+
if (!text.startsWith('||')) {
|
|
12
|
+
return text;
|
|
13
|
+
}
|
|
14
|
+
const closing = text.indexOf('||', 2);
|
|
15
|
+
if (closing < 0) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return text.slice(closing + 2).replace(/^\s+/, '');
|
|
19
|
+
}
|
|
20
|
+
function redactInboundMediaPaths(text) {
|
|
21
|
+
let redacted = text.replace(/(?:\/[\w.@+-]+)*\/\.mama\/workspace\/media\/inbound\/[^\s]+/g, '[attachment]');
|
|
22
|
+
const workspaces = new Set([process.env.MAMA_WORKSPACE, (0, node_path_1.join)((0, node_os_1.homedir)(), '.mama', 'workspace')]);
|
|
23
|
+
for (const workspace of workspaces) {
|
|
24
|
+
if (!workspace)
|
|
25
|
+
continue;
|
|
26
|
+
const inboundRoot = (0, node_path_1.join)(workspace, 'media', 'inbound');
|
|
27
|
+
const escapedRoot = inboundRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
28
|
+
redacted = redacted.replace(new RegExp(`${escapedRoot}(?:/[^\\s]+)+`, 'g'), '[attachment]');
|
|
29
|
+
}
|
|
30
|
+
return redacted;
|
|
31
|
+
}
|
|
32
|
+
function sanitizeVisibleText(text) {
|
|
33
|
+
const withoutDecoration = stripLeadingReasoningDecoration(text);
|
|
34
|
+
return withoutDecoration === null ? null : redactInboundMediaPaths(withoutDecoration);
|
|
35
|
+
}
|
|
36
|
+
function telegramErrorMessage(error) {
|
|
37
|
+
return error instanceof Error ? error.message : String(error);
|
|
38
|
+
}
|
|
39
|
+
function isSafeRateLimitRetry(error) {
|
|
40
|
+
if (error && typeof error === 'object' && 'error_code' in error && error.error_code === 429) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return /(?:^|\b)429\b|too many requests/i.test(telegramErrorMessage(error));
|
|
44
|
+
}
|
|
45
|
+
function splitTelegramMessage(text, maxLength) {
|
|
46
|
+
const codePoints = Array.from(text);
|
|
47
|
+
if (codePoints.length <= maxLength) {
|
|
48
|
+
return [text];
|
|
49
|
+
}
|
|
50
|
+
const chunks = [];
|
|
51
|
+
let remaining = codePoints;
|
|
52
|
+
while (remaining.length > 0) {
|
|
53
|
+
if (remaining.length <= maxLength) {
|
|
54
|
+
chunks.push(remaining.join(''));
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
const candidate = remaining.slice(0, maxLength);
|
|
58
|
+
const newline = candidate.lastIndexOf('\n');
|
|
59
|
+
const splitAt = newline > maxLength * 0.3 ? newline + 1 : maxLength;
|
|
60
|
+
chunks.push(remaining.slice(0, splitAt).join(''));
|
|
61
|
+
remaining = remaining.slice(splitAt);
|
|
62
|
+
}
|
|
63
|
+
return chunks;
|
|
64
|
+
}
|
|
65
|
+
class TelegramResponsePresenter {
|
|
66
|
+
adapter;
|
|
67
|
+
throttleMs;
|
|
68
|
+
maxLength;
|
|
69
|
+
handle = null;
|
|
70
|
+
accumulatedText = '';
|
|
71
|
+
toolStatus = '';
|
|
72
|
+
editTimer = null;
|
|
73
|
+
inFlightEdit = Promise.resolve();
|
|
74
|
+
finalized = false;
|
|
75
|
+
finalizing = false;
|
|
76
|
+
chunkRetryCount;
|
|
77
|
+
resumeFromChunk;
|
|
78
|
+
onChunkProgress;
|
|
79
|
+
constructor(adapter, options = {}) {
|
|
80
|
+
this.adapter = adapter;
|
|
81
|
+
this.throttleMs = options.throttleMs ?? DEFAULT_THROTTLE_MS;
|
|
82
|
+
this.maxLength = options.maxLength ?? DEFAULT_MAX_LENGTH;
|
|
83
|
+
this.chunkRetryCount = Math.max(1, options.chunkRetryCount ?? 3);
|
|
84
|
+
this.resumeFromChunk = Math.max(0, options.resumeFromChunk ?? 0);
|
|
85
|
+
this.onChunkProgress = options.onChunkProgress;
|
|
86
|
+
}
|
|
87
|
+
async start() {
|
|
88
|
+
if (this.handle || this.finalized || this.finalizing) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
this.handle = await this.adapter.send('⏳');
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
this.handle = null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
callbacks() {
|
|
99
|
+
return {
|
|
100
|
+
onDelta: (text) => {
|
|
101
|
+
if (this.finalized || this.finalizing) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.accumulatedText += text;
|
|
105
|
+
this.scheduleEdit();
|
|
106
|
+
},
|
|
107
|
+
onToolUse: (name) => {
|
|
108
|
+
if (this.finalized || this.finalizing) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
this.toolStatus = `🔧 ${name}...`;
|
|
112
|
+
this.scheduleEdit();
|
|
113
|
+
},
|
|
114
|
+
onToolComplete: (name, _toolUseId, isError) => {
|
|
115
|
+
if (this.finalized || this.finalizing || this.accumulatedText) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this.toolStatus = `${isError ? '❌' : '✅'} ${name}`;
|
|
119
|
+
this.scheduleEdit();
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
markQueued() {
|
|
124
|
+
if (this.finalized || this.finalizing) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
this.toolStatus = '⏳ Waiting for the earlier task to finish.';
|
|
128
|
+
this.scheduleEdit();
|
|
129
|
+
}
|
|
130
|
+
async finalize(rawResponse) {
|
|
131
|
+
if (this.finalized || this.finalizing) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
this.finalizing = true;
|
|
135
|
+
this.cancelPendingEdit();
|
|
136
|
+
try {
|
|
137
|
+
await this.inFlightEdit;
|
|
138
|
+
const sanitized = sanitizeVisibleText(rawResponse);
|
|
139
|
+
const visible = (sanitized ?? '').trim() || EMPTY_RESPONSE_MESSAGE;
|
|
140
|
+
const chunks = splitTelegramMessage(visible, this.maxLength);
|
|
141
|
+
if (this.resumeFromChunk >= chunks.length) {
|
|
142
|
+
this.finalized = true;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (!this.handle || this.resumeFromChunk > 0) {
|
|
146
|
+
if (this.handle) {
|
|
147
|
+
const staleHandle = this.handle;
|
|
148
|
+
this.handle = null;
|
|
149
|
+
await this.adapter.delete(staleHandle).catch(() => { });
|
|
150
|
+
}
|
|
151
|
+
await this.sendChunks(chunks.slice(this.resumeFromChunk), this.resumeFromChunk);
|
|
152
|
+
this.finalized = true;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const handle = this.handle;
|
|
156
|
+
this.handle = null;
|
|
157
|
+
try {
|
|
158
|
+
await this.recordChunkProgress(0, true);
|
|
159
|
+
await this.adapter.edit(handle, chunks[0]);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const message = telegramErrorMessage(error);
|
|
163
|
+
if (/message is not modified/i.test(message)) {
|
|
164
|
+
// Telegram already has the desired text. Treat this as committed.
|
|
165
|
+
}
|
|
166
|
+
else if (/message to edit not found/i.test(message)) {
|
|
167
|
+
await this.adapter.delete(handle).catch(() => { });
|
|
168
|
+
await this.sendChunks(chunks);
|
|
169
|
+
this.finalized = true;
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// A timeout/network error may mean the edit was applied remotely.
|
|
174
|
+
// Do not delete and resend an answer that could already be visible.
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
await this.recordChunkProgress(1, false);
|
|
179
|
+
await this.sendChunks(chunks.slice(1), 1);
|
|
180
|
+
this.finalized = true;
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
this.finalizing = false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async fail(message) {
|
|
187
|
+
await this.finalize(message);
|
|
188
|
+
}
|
|
189
|
+
scheduleEdit() {
|
|
190
|
+
if (this.editTimer || this.finalized) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
this.editTimer = setTimeout(() => {
|
|
194
|
+
this.editTimer = null;
|
|
195
|
+
this.inFlightEdit = this.inFlightEdit.then(() => this.flushStreamingEdit());
|
|
196
|
+
}, this.throttleMs);
|
|
197
|
+
}
|
|
198
|
+
async flushStreamingEdit() {
|
|
199
|
+
if (this.finalized || !this.handle) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const sanitized = sanitizeVisibleText(this.accumulatedText);
|
|
203
|
+
if (sanitized === null) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const visible = sanitized.trim() || this.toolStatus;
|
|
207
|
+
if (!visible) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const visibleCodePoints = Array.from(visible);
|
|
211
|
+
const bounded = visibleCodePoints.length > this.maxLength
|
|
212
|
+
? visibleCodePoints.slice(-this.maxLength).join('')
|
|
213
|
+
: visible;
|
|
214
|
+
await this.adapter.edit(this.handle, bounded).catch(() => { });
|
|
215
|
+
}
|
|
216
|
+
cancelPendingEdit() {
|
|
217
|
+
if (this.editTimer) {
|
|
218
|
+
clearTimeout(this.editTimer);
|
|
219
|
+
this.editTimer = null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async sendChunks(chunks, startIndex = 0) {
|
|
223
|
+
for (let offset = 0; offset < chunks.length; offset += 1) {
|
|
224
|
+
const chunk = chunks[offset];
|
|
225
|
+
const chunkIndex = startIndex + offset;
|
|
226
|
+
let lastError;
|
|
227
|
+
for (let attempt = 1; attempt <= this.chunkRetryCount; attempt += 1) {
|
|
228
|
+
try {
|
|
229
|
+
await this.recordChunkProgress(chunkIndex, true);
|
|
230
|
+
await this.adapter.send(chunk);
|
|
231
|
+
await this.recordChunkProgress(chunkIndex + 1, false);
|
|
232
|
+
lastError = undefined;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (!isSafeRateLimitRetry(error))
|
|
237
|
+
throw error;
|
|
238
|
+
lastError = error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (lastError)
|
|
242
|
+
throw lastError;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async recordChunkProgress(nextIndex, uncertain) {
|
|
246
|
+
await this.onChunkProgress?.(nextIndex, uncertain);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.TelegramResponsePresenter = TelegramResponsePresenter;
|
|
250
|
+
//# sourceMappingURL=telegram-response-presenter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-response-presenter.js","sourceRoot":"","sources":["../../src/gateways/telegram-response-presenter.ts"],"names":[],"mappings":";;;AAiEA,oDAmBC;AApFD,qCAAkC;AAClC,yCAAiC;AAIjC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAgB5D,SAAS,+BAA+B,CAAC,IAAY;IACnD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAY;IAC3C,IAAI,QAAQ,GAAG,IAAI,CAAC,OAAO,CACzB,8DAA8D,EAC9D,cAAc,CACf,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAChG,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QACvE,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,eAAe,EAAE,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,YAAY,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,kCAAkC,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY,EAAE,SAAiB;IAClE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAChC,MAAM;QACR,CAAC;QACD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAa,yBAAyB;IACnB,OAAO,CAA0B;IACjC,UAAU,CAAS;IACnB,SAAS,CAAS;IAC3B,MAAM,GAAkB,IAAI,CAAC;IAC7B,eAAe,GAAG,EAAE,CAAC;IACrB,UAAU,GAAG,EAAE,CAAC;IAChB,SAAS,GAAyC,IAAI,CAAC;IACvD,YAAY,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAChD,SAAS,GAAG,KAAK,CAAC;IAClB,UAAU,GAAG,KAAK,CAAC;IACV,eAAe,CAAS;IACxB,eAAe,CAAS;IACxB,eAAe,CAAuD;IAEvF,YAAY,OAAgC,EAAE,UAA4C,EAAE;QAC1F,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;QAC5D,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACzD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrD,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO;YACL,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACtC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;gBAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;YACD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;gBAClB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACtC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,KAAK,CAAC;gBAClC,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;YACD,cAAc,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;gBAC5C,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC9D,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,UAAU,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;gBACnD,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,2CAA2C,CAAC;QAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,WAAmB;QAChC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC;YAExB,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,sBAAsB,CAAC;YACnE,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAE7D,IAAI,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;gBAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;oBAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;oBACnB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACzD,CAAC;gBACD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBAChF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC5C,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7C,kEAAkE;gBACpE,CAAC;qBAAM,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;oBAClD,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;oBACtB,OAAO;gBACT,CAAC;qBAAM,CAAC;oBACN,kEAAkE;oBAClE,oEAAoE;oBACpE,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC9E,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC9B,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,OAAO,GACX,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YACvC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,CAAC,CAAC,OAAO,CAAC;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,MAAgB,EAAE,UAAU,GAAG,CAAC;QACvD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;YACvC,IAAI,SAAkB,CAAC;YACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACjD,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC/B,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;oBACtD,SAAS,GAAG,SAAS,CAAC;oBACtB,MAAM;gBACR,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;oBAC9C,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,IAAI,SAAS;gBAAE,MAAM,SAAS,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,SAAiB,EAAE,SAAkB;QACrE,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;CACF;AA/LD,8DA+LC"}
|
|
@@ -2,14 +2,16 @@
|
|
|
2
2
|
* Telegram Gateway for MAMA Standalone
|
|
3
3
|
*
|
|
4
4
|
* Production-hardened Telegram bot integration using grammY:
|
|
5
|
-
* -
|
|
5
|
+
* - Telegram message_id dedup without dropping repeated short replies
|
|
6
|
+
* - Photo/document/caption ingestion through MAMA content blocks
|
|
6
7
|
* - Group chat filtering (mention/command/reply-to-bot only)
|
|
7
8
|
* - Sticker receive/send with emotion mapping
|
|
8
|
-
* -
|
|
9
|
+
* - Single-message streaming presenter (placeholder → final answer)
|
|
9
10
|
* - Typing indicator, error handling
|
|
10
11
|
*/
|
|
11
12
|
import { BaseGateway } from './base-gateway.js';
|
|
12
13
|
import type { MessageRouter } from './message-router.js';
|
|
14
|
+
import { type TelegramMediaDownloadRequest } from './telegram-media.js';
|
|
13
15
|
/**
|
|
14
16
|
* Telegram Gateway configuration
|
|
15
17
|
*/
|
|
@@ -33,6 +35,12 @@ export interface TelegramGatewayOptions {
|
|
|
33
35
|
config?: Partial<TelegramGatewayConfig>;
|
|
34
36
|
/** Polling interval in ms (unused with grammY, kept for interface compat) */
|
|
35
37
|
pollIntervalMs?: number;
|
|
38
|
+
/** Internal test seam; production defaults to MAMA's private Telegram media directory. */
|
|
39
|
+
mediaRoot?: string;
|
|
40
|
+
/** Internal test seam for the external Telegram file request. */
|
|
41
|
+
fetchImpl?: TelegramMediaDownloadRequest['fetchImpl'];
|
|
42
|
+
/** Internal test/operations seam for restart-safe completed-message deduplication. */
|
|
43
|
+
messageLedgerPath?: string;
|
|
36
44
|
}
|
|
37
45
|
/**
|
|
38
46
|
* Telegram Gateway class
|
|
@@ -46,8 +54,12 @@ export declare class TelegramGateway extends BaseGateway {
|
|
|
46
54
|
private botUsername;
|
|
47
55
|
private lastError;
|
|
48
56
|
private lastMessageAt;
|
|
57
|
+
private readonly mediaRoot;
|
|
58
|
+
private readonly fetchImpl?;
|
|
59
|
+
private readonly messageLedger;
|
|
60
|
+
private readonly chatTails;
|
|
61
|
+
private readonly activeChat;
|
|
49
62
|
private recentMessageIds;
|
|
50
|
-
private recentMessageSignatures;
|
|
51
63
|
private rejectedChatWarnAt;
|
|
52
64
|
private dedupCleanupTimer;
|
|
53
65
|
private stickerCache;
|
|
@@ -57,13 +69,24 @@ export declare class TelegramGateway extends BaseGateway {
|
|
|
57
69
|
start(): Promise<void>;
|
|
58
70
|
stop(): Promise<void>;
|
|
59
71
|
private handleMessage;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
72
|
+
private runInChatQueue;
|
|
73
|
+
private processMessage;
|
|
74
|
+
sendMessage(chatId: string, text: string, idempotencyKey?: string): Promise<void>;
|
|
75
|
+
sendMessageFromActiveTurn(chatId: string, text: string, idempotencyKey?: string): Promise<void>;
|
|
76
|
+
private sendMessageNow;
|
|
77
|
+
sendFile(chatId: string, filePath: string, caption?: string, idempotencyKey?: string): Promise<void>;
|
|
78
|
+
sendFileFromActiveTurn(chatId: string, filePath: string, caption?: string, idempotencyKey?: string): Promise<void>;
|
|
79
|
+
sendImage(chatId: string, imagePath: string, caption?: string, idempotencyKey?: string): Promise<void>;
|
|
80
|
+
sendImageFromActiveTurn(chatId: string, imagePath: string, caption?: string, idempotencyKey?: string): Promise<void>;
|
|
81
|
+
private sendOutboundOnce;
|
|
82
|
+
private recoverPendingInboundDeliveries;
|
|
83
|
+
private createResponsePresenter;
|
|
84
|
+
private outboundLedgerKey;
|
|
63
85
|
sendSticker(chatId: string | number, emotion: string): Promise<boolean>;
|
|
86
|
+
sendStickerFromActiveTurn(chatId: string | number, emotion: string): Promise<boolean>;
|
|
87
|
+
private sendStickerNow;
|
|
64
88
|
getLastError(): string | null;
|
|
65
89
|
getLastMessageAt(): number | undefined;
|
|
66
|
-
private splitMessage;
|
|
67
90
|
private loadStickerSet;
|
|
68
91
|
}
|
|
69
92
|
//# sourceMappingURL=telegram.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/gateways/telegram.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/gateways/telegram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,qBAAqB,CAAC;AAI3E,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,qBAAqB,CAAC;AAwD7B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,aAAa,EAAE,aAAa,CAAC;IAC7B,4BAA4B;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACxC,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,SAAS,CAAC,EAAE,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACtD,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,MAAM,EAAG,UAAU,CAAU;IAEtC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAA4C;IACvE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAG9D,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,kBAAkB,CAA6B;IAGvD,OAAO,CAAC,iBAAiB,CAA+C;IAGxE,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,gBAAgB,CAAS;IAEjC,SAAS,KAAK,cAAc,IAAI,MAAM,GAAG,IAAI,CAE5C;gBAEW,OAAO,EAAE,sBAAsB;IAyBrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4GtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,aAAa;YAKb,cAAc;YAuBd,cAAc;IA+TtB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjF,yBAAyB,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;YAUF,cAAc;IAsDtB,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IAYV,sBAAsB,CAC1B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IAeV,SAAS,CACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IAYV,uBAAuB,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;YAeF,gBAAgB;YAiBhB,+BAA+B;IAoC7C,OAAO,CAAC,uBAAuB;IA8B/B,OAAO,CAAC,iBAAiB;IAKnB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvE,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAK7E,cAAc;IAkB5B,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,gBAAgB,IAAI,MAAM,GAAG,SAAS;YAIxB,cAAc;CAc7B"}
|