@jungjaehoon/mama-os 0.24.2 → 0.26.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.
Files changed (160) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +46 -23
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +10 -0
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/code-act/constants.js +2 -2
  7. package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
  8. package/dist/agent/code-act/host-bridge.js +91 -4
  9. package/dist/agent/code-act/host-bridge.js.map +1 -1
  10. package/dist/agent/code-act/tool-policy.d.ts +3 -1
  11. package/dist/agent/code-act/tool-policy.d.ts.map +1 -1
  12. package/dist/agent/code-act/tool-policy.js +3 -1
  13. package/dist/agent/code-act/tool-policy.js.map +1 -1
  14. package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
  15. package/dist/agent/code-act/type-definition-generator.js +2 -4
  16. package/dist/agent/code-act/type-definition-generator.js.map +1 -1
  17. package/dist/agent/context-compile-service.d.ts +2 -0
  18. package/dist/agent/context-compile-service.d.ts.map +1 -1
  19. package/dist/agent/context-compile-service.js +26 -7
  20. package/dist/agent/context-compile-service.js.map +1 -1
  21. package/dist/agent/drive-tools.d.ts +53 -0
  22. package/dist/agent/drive-tools.d.ts.map +1 -0
  23. package/dist/agent/drive-tools.js +261 -0
  24. package/dist/agent/drive-tools.js.map +1 -0
  25. package/dist/agent/gateway-tool-executor.d.ts +3 -0
  26. package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
  27. package/dist/agent/gateway-tool-executor.js +362 -19
  28. package/dist/agent/gateway-tool-executor.js.map +1 -1
  29. package/dist/agent/gateway-tools.md +9 -3
  30. package/dist/agent/tool-registry.d.ts.map +1 -1
  31. package/dist/agent/tool-registry.js +38 -3
  32. package/dist/agent/tool-registry.js.map +1 -1
  33. package/dist/agent/types.d.ts +45 -6
  34. package/dist/agent/types.d.ts.map +1 -1
  35. package/dist/agent/types.js.map +1 -1
  36. package/dist/api/operator-tasks-handler.d.ts.map +1 -1
  37. package/dist/api/operator-tasks-handler.js +23 -1
  38. package/dist/api/operator-tasks-handler.js.map +1 -1
  39. package/dist/cli/commands/start.d.ts +7 -3
  40. package/dist/cli/commands/start.d.ts.map +1 -1
  41. package/dist/cli/commands/start.js +113 -65
  42. package/dist/cli/commands/start.js.map +1 -1
  43. package/dist/cli/config/types.d.ts.map +1 -1
  44. package/dist/cli/config/types.js +7 -3
  45. package/dist/cli/config/types.js.map +1 -1
  46. package/dist/cli/runtime/agent-loop-init.d.ts +2 -0
  47. package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
  48. package/dist/cli/runtime/agent-loop-init.js +37 -12
  49. package/dist/cli/runtime/agent-loop-init.js.map +1 -1
  50. package/dist/cli/runtime/api-routes-init.js +3 -3
  51. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  52. package/dist/cli/runtime/envelope-bootstrap.d.ts.map +1 -1
  53. package/dist/cli/runtime/envelope-bootstrap.js +8 -1
  54. package/dist/cli/runtime/envelope-bootstrap.js.map +1 -1
  55. package/dist/cli/runtime/temporal-init.d.ts +28 -0
  56. package/dist/cli/runtime/temporal-init.d.ts.map +1 -0
  57. package/dist/cli/runtime/temporal-init.js +74 -0
  58. package/dist/cli/runtime/temporal-init.js.map +1 -0
  59. package/dist/connectors/drive/index.d.ts +1 -1
  60. package/dist/connectors/drive/index.d.ts.map +1 -1
  61. package/dist/connectors/drive/index.js +100 -56
  62. package/dist/connectors/drive/index.js.map +1 -1
  63. package/dist/connectors/framework/gws-utils.d.ts +3 -0
  64. package/dist/connectors/framework/gws-utils.d.ts.map +1 -1
  65. package/dist/connectors/framework/gws-utils.js +17 -0
  66. package/dist/connectors/framework/gws-utils.js.map +1 -1
  67. package/dist/db/migrations/operator-task-temporal.d.ts +8 -0
  68. package/dist/db/migrations/operator-task-temporal.d.ts.map +1 -0
  69. package/dist/db/migrations/operator-task-temporal.js +209 -0
  70. package/dist/db/migrations/operator-task-temporal.js.map +1 -0
  71. package/dist/envelope/enforcer.d.ts.map +1 -1
  72. package/dist/envelope/enforcer.js +24 -9
  73. package/dist/envelope/enforcer.js.map +1 -1
  74. package/dist/envelope/reactive-config.d.ts +1 -1
  75. package/dist/envelope/reactive-config.d.ts.map +1 -1
  76. package/dist/envelope/reactive-config.js +10 -2
  77. package/dist/envelope/reactive-config.js.map +1 -1
  78. package/dist/envelope/types.d.ts +1 -1
  79. package/dist/envelope/types.d.ts.map +1 -1
  80. package/dist/envelope/types.js.map +1 -1
  81. package/dist/gateways/message-router.d.ts +1 -0
  82. package/dist/gateways/message-router.d.ts.map +1 -1
  83. package/dist/gateways/message-router.js +7 -1
  84. package/dist/gateways/message-router.js.map +1 -1
  85. package/dist/gateways/telegram-media.d.ts +28 -0
  86. package/dist/gateways/telegram-media.d.ts.map +1 -0
  87. package/dist/gateways/telegram-media.js +165 -0
  88. package/dist/gateways/telegram-media.js.map +1 -0
  89. package/dist/gateways/telegram-response-presenter.d.ts +31 -0
  90. package/dist/gateways/telegram-response-presenter.d.ts.map +1 -0
  91. package/dist/gateways/telegram-response-presenter.js +153 -0
  92. package/dist/gateways/telegram-response-presenter.js.map +1 -0
  93. package/dist/gateways/telegram.d.ts +10 -3
  94. package/dist/gateways/telegram.d.ts.map +1 -1
  95. package/dist/gateways/telegram.js +174 -90
  96. package/dist/gateways/telegram.js.map +1 -1
  97. package/dist/gateways/types.d.ts +4 -2
  98. package/dist/gateways/types.d.ts.map +1 -1
  99. package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
  100. package/dist/multi-agent/dashboard-agent-persona.js +9 -4
  101. package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
  102. package/dist/operator/action-verifier.d.ts +23 -0
  103. package/dist/operator/action-verifier.d.ts.map +1 -1
  104. package/dist/operator/action-verifier.js +76 -0
  105. package/dist/operator/action-verifier.js.map +1 -1
  106. package/dist/operator/board-reconcile.d.ts.map +1 -1
  107. package/dist/operator/board-reconcile.js +3 -0
  108. package/dist/operator/board-reconcile.js.map +1 -1
  109. package/dist/operator/board-slot-instructions.d.ts +3 -3
  110. package/dist/operator/board-slot-instructions.d.ts.map +1 -1
  111. package/dist/operator/board-slot-instructions.js +17 -8
  112. package/dist/operator/board-slot-instructions.js.map +1 -1
  113. package/dist/operator/briefs.d.ts.map +1 -1
  114. package/dist/operator/briefs.js +3 -0
  115. package/dist/operator/briefs.js.map +1 -1
  116. package/dist/operator/task-ledger.d.ts +134 -8
  117. package/dist/operator/task-ledger.d.ts.map +1 -1
  118. package/dist/operator/task-ledger.js +1166 -65
  119. package/dist/operator/task-ledger.js.map +1 -1
  120. package/dist/operator/task-temporal.d.ts +21 -0
  121. package/dist/operator/task-temporal.d.ts.map +1 -0
  122. package/dist/operator/task-temporal.js +111 -0
  123. package/dist/operator/task-temporal.js.map +1 -0
  124. package/dist/operator/temporal-effect.d.ts +62 -0
  125. package/dist/operator/temporal-effect.d.ts.map +1 -0
  126. package/dist/operator/temporal-effect.js +71 -0
  127. package/dist/operator/temporal-effect.js.map +1 -0
  128. package/dist/operator/temporal-reconcile.d.ts +48 -0
  129. package/dist/operator/temporal-reconcile.d.ts.map +1 -0
  130. package/dist/operator/temporal-reconcile.js +215 -0
  131. package/dist/operator/temporal-reconcile.js.map +1 -0
  132. package/dist/operator/temporal-runtime.d.ts +54 -0
  133. package/dist/operator/temporal-runtime.d.ts.map +1 -0
  134. package/dist/operator/temporal-runtime.js +110 -0
  135. package/dist/operator/temporal-runtime.js.map +1 -0
  136. package/dist/operator/temporal-worker.d.ts +19 -0
  137. package/dist/operator/temporal-worker.d.ts.map +1 -0
  138. package/dist/operator/temporal-worker.js +105 -0
  139. package/dist/operator/temporal-worker.js.map +1 -0
  140. package/dist/operator/worker-run.d.ts +6 -2
  141. package/dist/operator/worker-run.d.ts.map +1 -1
  142. package/dist/operator/worker-run.js +14 -0
  143. package/dist/operator/worker-run.js.map +1 -1
  144. package/dist/operator/workorder-consumer.d.ts +27 -10
  145. package/dist/operator/workorder-consumer.d.ts.map +1 -1
  146. package/dist/operator/workorder-consumer.js +195 -14
  147. package/dist/operator/workorder-consumer.js.map +1 -1
  148. package/dist/operator/workorder-hooks.d.ts +3 -0
  149. package/dist/operator/workorder-hooks.d.ts.map +1 -1
  150. package/dist/operator/workorder-hooks.js +23 -0
  151. package/dist/operator/workorder-hooks.js.map +1 -1
  152. package/dist/operator/workorder-publishers.d.ts +10 -1
  153. package/dist/operator/workorder-publishers.d.ts.map +1 -1
  154. package/dist/operator/workorder-publishers.js +40 -3
  155. package/dist/operator/workorder-publishers.js.map +1 -1
  156. package/package.json +1 -1
  157. package/public/ui/assets/{index-OSgiwL24.js → index-BDXDGEV6.js} +15 -15
  158. package/public/ui/assets/index-po2tN0xq.css +1 -0
  159. package/public/ui/index.html +2 -2
  160. package/public/ui/assets/index-CKOJQYXA.css +0 -1
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.downloadTelegramMedia = downloadTelegramMedia;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ const TELEGRAM_HOSTED_DOWNLOAD_LIMIT_BYTES = 20 * 1024 * 1024;
8
+ const DEFAULT_ATTACHMENT_LIMIT_BYTES = 25 * 1024 * 1024;
9
+ const DEFAULT_DOWNLOAD_TIMEOUT_MS = 30_000;
10
+ class TelegramMediaError extends Error {
11
+ }
12
+ async function withDownloadTimeout(promise, timeoutMs) {
13
+ let timer;
14
+ try {
15
+ return await Promise.race([
16
+ promise,
17
+ new Promise((_resolve, reject) => {
18
+ timer = setTimeout(() => reject(new TelegramMediaError('Telegram media download timed out')), timeoutMs);
19
+ }),
20
+ ]);
21
+ }
22
+ finally {
23
+ if (timer)
24
+ clearTimeout(timer);
25
+ }
26
+ }
27
+ function configuredAttachmentLimit() {
28
+ const configured = Number(process.env.MAMA_ATTACHMENT_MAX_DOWNLOAD_BYTES);
29
+ return Number.isFinite(configured) && configured > 0
30
+ ? configured
31
+ : DEFAULT_ATTACHMENT_LIMIT_BYTES;
32
+ }
33
+ function effectiveLimit(requested) {
34
+ const base = requested && requested > 0 ? requested : configuredAttachmentLimit();
35
+ return Math.min(base, TELEGRAM_HOSTED_DOWNLOAD_LIMIT_BYTES);
36
+ }
37
+ function safeOpaqueId(value) {
38
+ const sanitized = value.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 120);
39
+ return sanitized || (0, node_crypto_1.randomUUID)();
40
+ }
41
+ function safeFilename(request) {
42
+ const opaqueId = safeOpaqueId(request.fileUniqueId);
43
+ const fallback = request.kind === 'photo' ? `photo-${opaqueId}.jpg` : `document-${opaqueId}.bin`;
44
+ const raw = request.filename ? (0, node_path_1.basename)(request.filename.replace(/\\/g, '/')) : fallback;
45
+ const sanitized = raw.replace(/[^a-zA-Z0-9._-]/g, '_').replace(/^\.+/, '');
46
+ if (!sanitized) {
47
+ return fallback;
48
+ }
49
+ if (request.kind === 'photo' && !(0, node_path_1.extname)(sanitized)) {
50
+ return `${sanitized}.jpg`;
51
+ }
52
+ if (request.kind === 'document' && !(0, node_path_1.extname)(sanitized)) {
53
+ return `${sanitized}.bin`;
54
+ }
55
+ return sanitized;
56
+ }
57
+ function assertSafeTelegramPath(filePath) {
58
+ if (!filePath) {
59
+ throw new TelegramMediaError('Telegram media path is unavailable');
60
+ }
61
+ const normalized = filePath.replace(/\\/g, '/');
62
+ const segments = normalized.split('/');
63
+ if (normalized.startsWith('/') ||
64
+ normalized.includes('\0') ||
65
+ segments.some((segment) => segment === '..' || segment === '')) {
66
+ throw new TelegramMediaError('Telegram media path is invalid');
67
+ }
68
+ return normalized;
69
+ }
70
+ function assertWithinRoot(root, candidate) {
71
+ const resolvedRoot = (0, node_path_1.resolve)(root);
72
+ const resolvedCandidate = (0, node_path_1.resolve)(candidate);
73
+ if (!resolvedCandidate.startsWith(`${resolvedRoot}${node_path_1.sep}`)) {
74
+ throw new TelegramMediaError('Telegram media storage path is invalid');
75
+ }
76
+ }
77
+ function downloadUrl(botToken, filePath) {
78
+ const encodedPath = filePath.split('/').map(encodeURIComponent).join('/');
79
+ return `https://api.telegram.org/file/bot${botToken}/${encodedPath}`;
80
+ }
81
+ async function downloadTelegramMedia(request) {
82
+ const limit = effectiveLimit(request.maxBytes);
83
+ const timeoutMs = request.timeoutMs && request.timeoutMs > 0 ? request.timeoutMs : DEFAULT_DOWNLOAD_TIMEOUT_MS;
84
+ if (request.declaredSize !== undefined && request.declaredSize > limit) {
85
+ throw new TelegramMediaError('Telegram media exceeds the download limit');
86
+ }
87
+ const metadata = await withDownloadTimeout(request.getFile(request.fileId), timeoutMs);
88
+ if (metadata.file_size !== undefined && metadata.file_size > limit) {
89
+ throw new TelegramMediaError('Telegram media exceeds the download limit');
90
+ }
91
+ const filePath = assertSafeTelegramPath(metadata.file_path);
92
+ const root = (0, node_path_1.resolve)(request.mediaRoot);
93
+ await (0, promises_1.mkdir)(root, { recursive: true, mode: 0o700 });
94
+ await (0, promises_1.chmod)(root, 0o700);
95
+ const fetchImpl = request.fetchImpl ?? fetch;
96
+ let response;
97
+ try {
98
+ response = await withDownloadTimeout(fetchImpl(downloadUrl(request.botToken, filePath), {
99
+ signal: AbortSignal.timeout(timeoutMs),
100
+ }), timeoutMs);
101
+ }
102
+ catch (error) {
103
+ if (error instanceof TelegramMediaError) {
104
+ throw error;
105
+ }
106
+ throw new TelegramMediaError('Telegram media download failed');
107
+ }
108
+ if (!response.ok || !response.body) {
109
+ throw new TelegramMediaError('Telegram media download failed');
110
+ }
111
+ const contentLength = Number(response.headers.get('content-length'));
112
+ if (Number.isFinite(contentLength) && contentLength > limit) {
113
+ throw new TelegramMediaError('Telegram media exceeds the download limit');
114
+ }
115
+ const filename = safeFilename(request);
116
+ const id = (0, node_crypto_1.randomUUID)();
117
+ const tempPath = (0, node_path_1.resolve)(root, `.${id}.part`);
118
+ const finalPath = (0, node_path_1.resolve)(root, `${id}-${filename}`);
119
+ assertWithinRoot(root, tempPath);
120
+ assertWithinRoot(root, finalPath);
121
+ let handle = null;
122
+ let totalBytes = 0;
123
+ try {
124
+ handle = await (0, promises_1.open)(tempPath, 'wx', 0o600);
125
+ const reader = response.body.getReader();
126
+ let streamComplete = false;
127
+ while (!streamComplete) {
128
+ const { done, value } = await withDownloadTimeout(reader.read(), timeoutMs);
129
+ if (done) {
130
+ streamComplete = true;
131
+ continue;
132
+ }
133
+ totalBytes += value.byteLength;
134
+ if (totalBytes > limit) {
135
+ await reader.cancel();
136
+ throw new TelegramMediaError('Telegram media exceeds the download limit');
137
+ }
138
+ await handle.write(value);
139
+ }
140
+ await handle.close();
141
+ handle = null;
142
+ await (0, promises_1.chmod)(tempPath, 0o600);
143
+ await (0, promises_1.rename)(tempPath, finalPath);
144
+ await (0, promises_1.chmod)(finalPath, 0o600);
145
+ }
146
+ catch (error) {
147
+ if (handle) {
148
+ await handle.close().catch(() => { });
149
+ }
150
+ await (0, promises_1.unlink)(tempPath).catch(() => { });
151
+ if (error instanceof TelegramMediaError) {
152
+ throw error;
153
+ }
154
+ throw new TelegramMediaError('Telegram media download failed');
155
+ }
156
+ return {
157
+ localPath: finalPath,
158
+ sourceRef: `telegram:${safeOpaqueId(request.fileUniqueId)}`,
159
+ filename,
160
+ mimeType: request.mimeType || (request.kind === 'photo' ? 'image/jpeg' : 'application/octet-stream'),
161
+ size: totalBytes,
162
+ kind: request.kind,
163
+ };
164
+ }
165
+ //# sourceMappingURL=telegram-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-media.js","sourceRoot":"","sources":["../../src/gateways/telegram-media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { StreamCallbacks } from '../agent/types.js';
2
+ export interface TelegramResponseAdapter {
3
+ send(text: string): Promise<string | null>;
4
+ edit(handle: string, text: string): Promise<void>;
5
+ delete(handle: string): Promise<void>;
6
+ }
7
+ export interface TelegramResponsePresenterOptions {
8
+ throttleMs?: number;
9
+ maxLength?: number;
10
+ }
11
+ export declare class TelegramResponsePresenter {
12
+ private readonly adapter;
13
+ private readonly throttleMs;
14
+ private readonly maxLength;
15
+ private handle;
16
+ private accumulatedText;
17
+ private toolStatus;
18
+ private editTimer;
19
+ private inFlightEdit;
20
+ private finalized;
21
+ constructor(adapter: TelegramResponseAdapter, options?: TelegramResponsePresenterOptions);
22
+ start(): Promise<void>;
23
+ callbacks(): StreamCallbacks;
24
+ finalize(rawResponse: string): Promise<void>;
25
+ fail(message: string): Promise<void>;
26
+ private scheduleEdit;
27
+ private flushStreamingEdit;
28
+ private cancelPendingEdit;
29
+ private sendChunks;
30
+ }
31
+ //# sourceMappingURL=telegram-response-presenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-response-presenter.d.ts","sourceRoot":"","sources":["../../src/gateways/telegram-response-presenter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMzD,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,gCAAgC;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsCD,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,uBAAuB,EAAE,OAAO,GAAE,gCAAqC;IAMtF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,SAAS,IAAI,eAAe;IA0BtB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B5C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,OAAO,CAAC,YAAY;YAUN,kBAAkB;IAgBhC,OAAO,CAAC,iBAAiB;YAOX,UAAU;CAKzB"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TelegramResponsePresenter = void 0;
4
+ const DEFAULT_THROTTLE_MS = 800;
5
+ const DEFAULT_MAX_LENGTH = 4096;
6
+ const EMPTY_RESPONSE_MESSAGE = 'No response was generated.';
7
+ function stripLeadingReasoningDecoration(text) {
8
+ if (!text.startsWith('||')) {
9
+ return text;
10
+ }
11
+ const closing = text.indexOf('||', 2);
12
+ if (closing < 0) {
13
+ return null;
14
+ }
15
+ return text.slice(closing + 2).replace(/^\s+/, '');
16
+ }
17
+ function redactInboundMediaPaths(text) {
18
+ return text.replace(/(?:\/[\w.@+-]+)*\/\.mama\/workspace\/media\/inbound\/[^\s]+/g, '[attachment]');
19
+ }
20
+ function sanitizeVisibleText(text) {
21
+ const withoutDecoration = stripLeadingReasoningDecoration(text);
22
+ return withoutDecoration === null ? null : redactInboundMediaPaths(withoutDecoration);
23
+ }
24
+ function splitMessage(text, maxLength) {
25
+ if (text.length <= maxLength) {
26
+ return [text];
27
+ }
28
+ const chunks = [];
29
+ let remaining = text;
30
+ while (remaining.length > 0) {
31
+ chunks.push(remaining.slice(0, maxLength));
32
+ remaining = remaining.slice(maxLength);
33
+ }
34
+ return chunks;
35
+ }
36
+ class TelegramResponsePresenter {
37
+ adapter;
38
+ throttleMs;
39
+ maxLength;
40
+ handle = null;
41
+ accumulatedText = '';
42
+ toolStatus = '';
43
+ editTimer = null;
44
+ inFlightEdit = Promise.resolve();
45
+ finalized = false;
46
+ constructor(adapter, options = {}) {
47
+ this.adapter = adapter;
48
+ this.throttleMs = options.throttleMs ?? DEFAULT_THROTTLE_MS;
49
+ this.maxLength = options.maxLength ?? DEFAULT_MAX_LENGTH;
50
+ }
51
+ async start() {
52
+ if (this.handle || this.finalized) {
53
+ return;
54
+ }
55
+ try {
56
+ this.handle = await this.adapter.send('⏳');
57
+ }
58
+ catch {
59
+ this.handle = null;
60
+ }
61
+ }
62
+ callbacks() {
63
+ return {
64
+ onDelta: (text) => {
65
+ if (this.finalized) {
66
+ return;
67
+ }
68
+ this.accumulatedText += text;
69
+ this.scheduleEdit();
70
+ },
71
+ onToolUse: (name) => {
72
+ if (this.finalized) {
73
+ return;
74
+ }
75
+ this.toolStatus = `🔧 ${name}...`;
76
+ this.scheduleEdit();
77
+ },
78
+ onToolComplete: (name, _toolUseId, isError) => {
79
+ if (this.finalized || this.accumulatedText) {
80
+ return;
81
+ }
82
+ this.toolStatus = `${isError ? '❌' : '✅'} ${name}`;
83
+ this.scheduleEdit();
84
+ },
85
+ };
86
+ }
87
+ async finalize(rawResponse) {
88
+ if (this.finalized) {
89
+ return;
90
+ }
91
+ this.finalized = true;
92
+ this.cancelPendingEdit();
93
+ await this.inFlightEdit;
94
+ const sanitized = sanitizeVisibleText(rawResponse);
95
+ const visible = (sanitized ?? '').trim() || EMPTY_RESPONSE_MESSAGE;
96
+ const chunks = splitMessage(visible, this.maxLength);
97
+ if (!this.handle) {
98
+ await this.sendChunks(chunks);
99
+ return;
100
+ }
101
+ const handle = this.handle;
102
+ this.handle = null;
103
+ try {
104
+ await this.adapter.edit(handle, chunks[0]);
105
+ }
106
+ catch {
107
+ await this.adapter.delete(handle).catch(() => { });
108
+ await this.sendChunks(chunks);
109
+ return;
110
+ }
111
+ await this.sendChunks(chunks.slice(1));
112
+ }
113
+ async fail(message) {
114
+ await this.finalize(message);
115
+ }
116
+ scheduleEdit() {
117
+ if (this.editTimer || this.finalized) {
118
+ return;
119
+ }
120
+ this.editTimer = setTimeout(() => {
121
+ this.editTimer = null;
122
+ this.inFlightEdit = this.inFlightEdit.then(() => this.flushStreamingEdit());
123
+ }, this.throttleMs);
124
+ }
125
+ async flushStreamingEdit() {
126
+ if (this.finalized || !this.handle) {
127
+ return;
128
+ }
129
+ const sanitized = sanitizeVisibleText(this.accumulatedText);
130
+ if (sanitized === null) {
131
+ return;
132
+ }
133
+ const visible = sanitized.trim() || this.toolStatus;
134
+ if (!visible) {
135
+ return;
136
+ }
137
+ const bounded = visible.length > this.maxLength ? visible.slice(-this.maxLength) : visible;
138
+ await this.adapter.edit(this.handle, bounded).catch(() => { });
139
+ }
140
+ cancelPendingEdit() {
141
+ if (this.editTimer) {
142
+ clearTimeout(this.editTimer);
143
+ this.editTimer = null;
144
+ }
145
+ }
146
+ async sendChunks(chunks) {
147
+ for (const chunk of chunks) {
148
+ await this.adapter.send(chunk);
149
+ }
150
+ }
151
+ }
152
+ exports.TelegramResponsePresenter = TelegramResponsePresenter;
153
+ //# 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":"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"}
@@ -2,14 +2,16 @@
2
2
  * Telegram Gateway for MAMA Standalone
3
3
  *
4
4
  * Production-hardened Telegram bot integration using grammY:
5
- * - 2-stage message dedup (message_id + content signature)
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
- * - ToolStatusTracker streaming (placeholder → editMessageText)
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,10 @@ 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'];
36
42
  }
37
43
  /**
38
44
  * Telegram Gateway class
@@ -46,8 +52,9 @@ export declare class TelegramGateway extends BaseGateway {
46
52
  private botUsername;
47
53
  private lastError;
48
54
  private lastMessageAt;
55
+ private readonly mediaRoot;
56
+ private readonly fetchImpl?;
49
57
  private recentMessageIds;
50
- private recentMessageSignatures;
51
58
  private rejectedChatWarnAt;
52
59
  private dedupCleanupTimer;
53
60
  private stickerCache;
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/gateways/telegram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,qBAAqB,CAAC;AAgC3E;;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;CACzB;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;IAG1C,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,uBAAuB,CAA6B;IAC5D,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;IAUrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0FtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,aAAa;IAkLrB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB7E,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAItC,OAAO,CAAC,YAAY;YAiBN,cAAc;CAc7B"}
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/gateways/telegram.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,qBAAqB,CAAC;AAI3E,OAAO,EAAyB,KAAK,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AA4B/F;;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;CACvD;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;IAGvE,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;IAarC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuFtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,aAAa;IAmRrB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB7E,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAItC,OAAO,CAAC,YAAY;YAiBN,cAAc;CAc7B"}