remoat 0.2.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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +297 -0
  3. package/dist/bin/cli.d.ts +2 -0
  4. package/dist/bin/cli.js +80 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/bin/commands/doctor.d.ts +1 -0
  7. package/dist/bin/commands/doctor.js +211 -0
  8. package/dist/bin/commands/doctor.js.map +1 -0
  9. package/dist/bin/commands/open.d.ts +1 -0
  10. package/dist/bin/commands/open.js +187 -0
  11. package/dist/bin/commands/open.js.map +1 -0
  12. package/dist/bin/commands/setup.d.ts +1 -0
  13. package/dist/bin/commands/setup.js +267 -0
  14. package/dist/bin/commands/setup.js.map +1 -0
  15. package/dist/bin/commands/start.d.ts +2 -0
  16. package/dist/bin/commands/start.js +39 -0
  17. package/dist/bin/commands/start.js.map +1 -0
  18. package/dist/bot/index.d.ts +2 -0
  19. package/dist/bot/index.js +1393 -0
  20. package/dist/bot/index.js.map +1 -0
  21. package/dist/commands/chatCommandHandler.d.ts +20 -0
  22. package/dist/commands/chatCommandHandler.js +30 -0
  23. package/dist/commands/chatCommandHandler.js.map +1 -0
  24. package/dist/commands/cleanupCommandHandler.d.ts +21 -0
  25. package/dist/commands/cleanupCommandHandler.js +40 -0
  26. package/dist/commands/cleanupCommandHandler.js.map +1 -0
  27. package/dist/commands/joinCommandHandler.d.ts +19 -0
  28. package/dist/commands/joinCommandHandler.js +27 -0
  29. package/dist/commands/joinCommandHandler.js.map +1 -0
  30. package/dist/commands/messageParser.d.ts +7 -0
  31. package/dist/commands/messageParser.js +29 -0
  32. package/dist/commands/messageParser.js.map +1 -0
  33. package/dist/commands/slashCommandHandler.d.ts +21 -0
  34. package/dist/commands/slashCommandHandler.js +105 -0
  35. package/dist/commands/slashCommandHandler.js.map +1 -0
  36. package/dist/commands/workspaceCommandHandler.d.ts +16 -0
  37. package/dist/commands/workspaceCommandHandler.js +29 -0
  38. package/dist/commands/workspaceCommandHandler.js.map +1 -0
  39. package/dist/database/chatSessionRepository.d.ts +59 -0
  40. package/dist/database/chatSessionRepository.js +110 -0
  41. package/dist/database/chatSessionRepository.js.map +1 -0
  42. package/dist/database/scheduleRepository.d.ts +60 -0
  43. package/dist/database/scheduleRepository.js +106 -0
  44. package/dist/database/scheduleRepository.js.map +1 -0
  45. package/dist/database/templateRepository.d.ts +51 -0
  46. package/dist/database/templateRepository.js +90 -0
  47. package/dist/database/templateRepository.js.map +1 -0
  48. package/dist/database/workspaceBindingRepository.d.ts +48 -0
  49. package/dist/database/workspaceBindingRepository.js +92 -0
  50. package/dist/database/workspaceBindingRepository.js.map +1 -0
  51. package/dist/index.d.ts +1 -0
  52. package/dist/index.js +11 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/middleware/auth.d.ts +5 -0
  55. package/dist/middleware/auth.js +14 -0
  56. package/dist/middleware/auth.js.map +1 -0
  57. package/dist/middleware/sanitize.d.ts +1 -0
  58. package/dist/middleware/sanitize.js +18 -0
  59. package/dist/middleware/sanitize.js.map +1 -0
  60. package/dist/services/antigravityLauncher.d.ts +7 -0
  61. package/dist/services/antigravityLauncher.js +94 -0
  62. package/dist/services/antigravityLauncher.js.map +1 -0
  63. package/dist/services/approvalDetector.d.ts +97 -0
  64. package/dist/services/approvalDetector.js +394 -0
  65. package/dist/services/approvalDetector.js.map +1 -0
  66. package/dist/services/assistantDomExtractor.d.ts +49 -0
  67. package/dist/services/assistantDomExtractor.js +340 -0
  68. package/dist/services/assistantDomExtractor.js.map +1 -0
  69. package/dist/services/autoAcceptService.d.ts +14 -0
  70. package/dist/services/autoAcceptService.js +81 -0
  71. package/dist/services/autoAcceptService.js.map +1 -0
  72. package/dist/services/cdpBridgeManager.d.ts +50 -0
  73. package/dist/services/cdpBridgeManager.js +355 -0
  74. package/dist/services/cdpBridgeManager.js.map +1 -0
  75. package/dist/services/cdpConnectionPool.d.ts +88 -0
  76. package/dist/services/cdpConnectionPool.js +235 -0
  77. package/dist/services/cdpConnectionPool.js.map +1 -0
  78. package/dist/services/cdpService.d.ts +214 -0
  79. package/dist/services/cdpService.js +1423 -0
  80. package/dist/services/cdpService.js.map +1 -0
  81. package/dist/services/chatSessionService.d.ts +89 -0
  82. package/dist/services/chatSessionService.js +738 -0
  83. package/dist/services/chatSessionService.js.map +1 -0
  84. package/dist/services/errorPopupDetector.d.ts +89 -0
  85. package/dist/services/errorPopupDetector.js +274 -0
  86. package/dist/services/errorPopupDetector.js.map +1 -0
  87. package/dist/services/modeService.d.ts +44 -0
  88. package/dist/services/modeService.js +74 -0
  89. package/dist/services/modeService.js.map +1 -0
  90. package/dist/services/modelService.d.ts +36 -0
  91. package/dist/services/modelService.js +64 -0
  92. package/dist/services/modelService.js.map +1 -0
  93. package/dist/services/planningDetector.d.ts +87 -0
  94. package/dist/services/planningDetector.js +321 -0
  95. package/dist/services/planningDetector.js.map +1 -0
  96. package/dist/services/processManager.d.ts +18 -0
  97. package/dist/services/processManager.js +62 -0
  98. package/dist/services/processManager.js.map +1 -0
  99. package/dist/services/progressSender.d.ts +20 -0
  100. package/dist/services/progressSender.js +65 -0
  101. package/dist/services/progressSender.js.map +1 -0
  102. package/dist/services/promptDispatcher.d.ts +38 -0
  103. package/dist/services/promptDispatcher.js +42 -0
  104. package/dist/services/promptDispatcher.js.map +1 -0
  105. package/dist/services/quotaService.d.ts +21 -0
  106. package/dist/services/quotaService.js +191 -0
  107. package/dist/services/quotaService.js.map +1 -0
  108. package/dist/services/responseMonitor.d.ts +129 -0
  109. package/dist/services/responseMonitor.js +996 -0
  110. package/dist/services/responseMonitor.js.map +1 -0
  111. package/dist/services/scheduleService.d.ts +58 -0
  112. package/dist/services/scheduleService.js +135 -0
  113. package/dist/services/scheduleService.js.map +1 -0
  114. package/dist/services/screenshotService.d.ts +55 -0
  115. package/dist/services/screenshotService.js +86 -0
  116. package/dist/services/screenshotService.js.map +1 -0
  117. package/dist/services/telegramTopicManager.d.ts +40 -0
  118. package/dist/services/telegramTopicManager.js +103 -0
  119. package/dist/services/telegramTopicManager.js.map +1 -0
  120. package/dist/services/titleGeneratorService.d.ts +32 -0
  121. package/dist/services/titleGeneratorService.js +114 -0
  122. package/dist/services/titleGeneratorService.js.map +1 -0
  123. package/dist/services/updateCheckService.d.ts +16 -0
  124. package/dist/services/updateCheckService.js +148 -0
  125. package/dist/services/updateCheckService.js.map +1 -0
  126. package/dist/services/userMessageDetector.d.ts +57 -0
  127. package/dist/services/userMessageDetector.js +222 -0
  128. package/dist/services/userMessageDetector.js.map +1 -0
  129. package/dist/services/workspaceService.d.ts +33 -0
  130. package/dist/services/workspaceService.js +65 -0
  131. package/dist/services/workspaceService.js.map +1 -0
  132. package/dist/ui/autoAcceptUi.d.ts +6 -0
  133. package/dist/ui/autoAcceptUi.js +22 -0
  134. package/dist/ui/autoAcceptUi.js.map +1 -0
  135. package/dist/ui/modeUi.d.ts +12 -0
  136. package/dist/ui/modeUi.js +40 -0
  137. package/dist/ui/modeUi.js.map +1 -0
  138. package/dist/ui/modelsUi.d.ts +12 -0
  139. package/dist/ui/modelsUi.js +101 -0
  140. package/dist/ui/modelsUi.js.map +1 -0
  141. package/dist/ui/projectListUi.d.ts +11 -0
  142. package/dist/ui/projectListUi.js +59 -0
  143. package/dist/ui/projectListUi.js.map +1 -0
  144. package/dist/ui/screenshotUi.d.ts +6 -0
  145. package/dist/ui/screenshotUi.js +28 -0
  146. package/dist/ui/screenshotUi.js.map +1 -0
  147. package/dist/ui/sessionPickerUi.d.ts +8 -0
  148. package/dist/ui/sessionPickerUi.js +32 -0
  149. package/dist/ui/sessionPickerUi.js.map +1 -0
  150. package/dist/ui/templateUi.d.ts +5 -0
  151. package/dist/ui/templateUi.js +44 -0
  152. package/dist/ui/templateUi.js.map +1 -0
  153. package/dist/utils/cdpPorts.d.ts +2 -0
  154. package/dist/utils/cdpPorts.js +6 -0
  155. package/dist/utils/cdpPorts.js.map +1 -0
  156. package/dist/utils/config.d.ts +14 -0
  157. package/dist/utils/config.js +12 -0
  158. package/dist/utils/config.js.map +1 -0
  159. package/dist/utils/configLoader.d.ts +23 -0
  160. package/dist/utils/configLoader.js +153 -0
  161. package/dist/utils/configLoader.js.map +1 -0
  162. package/dist/utils/htmlToTelegramMarkdown.d.ts +6 -0
  163. package/dist/utils/htmlToTelegramMarkdown.js +189 -0
  164. package/dist/utils/htmlToTelegramMarkdown.js.map +1 -0
  165. package/dist/utils/i18n.d.ts +3 -0
  166. package/dist/utils/i18n.js +78 -0
  167. package/dist/utils/i18n.js.map +1 -0
  168. package/dist/utils/imageHandler.d.ts +35 -0
  169. package/dist/utils/imageHandler.js +155 -0
  170. package/dist/utils/imageHandler.js.map +1 -0
  171. package/dist/utils/lockfile.d.ts +7 -0
  172. package/dist/utils/lockfile.js +117 -0
  173. package/dist/utils/lockfile.js.map +1 -0
  174. package/dist/utils/logger.d.ts +23 -0
  175. package/dist/utils/logger.js +85 -0
  176. package/dist/utils/logger.js.map +1 -0
  177. package/dist/utils/logo.d.ts +1 -0
  178. package/dist/utils/logo.js +14 -0
  179. package/dist/utils/logo.js.map +1 -0
  180. package/dist/utils/metadataExtractor.d.ts +5 -0
  181. package/dist/utils/metadataExtractor.js +16 -0
  182. package/dist/utils/metadataExtractor.js.map +1 -0
  183. package/dist/utils/pathUtils.d.ts +23 -0
  184. package/dist/utils/pathUtils.js +58 -0
  185. package/dist/utils/pathUtils.js.map +1 -0
  186. package/dist/utils/processLogBuffer.d.ts +17 -0
  187. package/dist/utils/processLogBuffer.js +108 -0
  188. package/dist/utils/processLogBuffer.js.map +1 -0
  189. package/dist/utils/streamMessageFormatter.d.ts +18 -0
  190. package/dist/utils/streamMessageFormatter.js +91 -0
  191. package/dist/utils/streamMessageFormatter.js.map +1 -0
  192. package/dist/utils/telegramFormatter.d.ts +37 -0
  193. package/dist/utils/telegramFormatter.js +445 -0
  194. package/dist/utils/telegramFormatter.js.map +1 -0
  195. package/dist/utils/voiceHandler.d.ts +23 -0
  196. package/dist/utils/voiceHandler.js +169 -0
  197. package/dist/utils/voiceHandler.js.map +1 -0
  198. package/locales/en.json +85 -0
  199. package/locales/ja.json +109 -0
  200. package/package.json +84 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Telegram text formatter — HTML-based formatting for Telegram messages.
3
+ * Formats text for Telegram HTML parse mode.
4
+ */
5
+ /**
6
+ * Escape special HTML characters for Telegram HTML parse mode.
7
+ */
8
+ export declare function escapeHtml(text: string): string;
9
+ /**
10
+ * Format text for Telegram HTML display.
11
+ * Converts Markdown syntax to Telegram HTML, wraps table/tree lines in <pre>,
12
+ * and file references in <code>.
13
+ */
14
+ export declare function formatForTelegram(text: string): string;
15
+ export declare function splitOutputAndLogs(rawText: string): {
16
+ output: string;
17
+ logs: string;
18
+ };
19
+ export declare function separateOutputForDelivery(options: {
20
+ rawText: string;
21
+ domSource: 'dom-structured' | 'legacy-fallback';
22
+ domOutputText?: string;
23
+ domActivityLines?: string[];
24
+ }): {
25
+ source: string;
26
+ output: string;
27
+ logs: string;
28
+ };
29
+ /**
30
+ * Split an HTML-formatted string into multiple Telegram-safe chunks.
31
+ * Respects HTML tag boundaries — unclosed tags at chunk end are closed
32
+ * and reopened at the start of the next chunk.
33
+ *
34
+ * Supported tags: <pre>, <code>, <b>, <i>, <pre><code ...>
35
+ */
36
+ export declare function splitTelegramHtml(html: string, maxLen?: number): string[];
37
+ export declare function sanitizeActivityLines(raw: string): string;
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+ /**
3
+ * Telegram text formatter — HTML-based formatting for Telegram messages.
4
+ * Formats text for Telegram HTML parse mode.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.escapeHtml = escapeHtml;
8
+ exports.formatForTelegram = formatForTelegram;
9
+ exports.splitOutputAndLogs = splitOutputAndLogs;
10
+ exports.separateOutputForDelivery = separateOutputForDelivery;
11
+ exports.splitTelegramHtml = splitTelegramHtml;
12
+ exports.sanitizeActivityLines = sanitizeActivityLines;
13
+ const UI_CHROME_LITERALS = new Set([
14
+ 'analyzed', 'analyzing', 'reading', 'writing', 'running',
15
+ 'searching', 'planning', 'thinking', 'thinking...', 'processing',
16
+ 'loading', 'executing', 'testing', 'debugging', 'read', 'wrote',
17
+ 'ran', 'good', 'bad', 'good bad', 'show details',
18
+ 'json', 'css', 'html', 'xml', 'yaml', 'toml', 'sql', 'graphql',
19
+ ]);
20
+ const UI_CHROME_REGEXES = [
21
+ /^[+-]\d+$/,
22
+ /^\d+\s*chars?$/i,
23
+ /^line\s+\d+/i,
24
+ /^col\s+\d+/i,
25
+ /^tool call:/i,
26
+ /^tool result:/i,
27
+ /^calling tool\b/i,
28
+ /^tool response\b/i,
29
+ /^mcp\b/i,
30
+ /^thought for\s*<?\d+/i,
31
+ /^show details$/i,
32
+ /^[a-z0-9._-]+\s*\/\s*[a-z0-9._-]+$/i,
33
+ /^full output written to\b/i,
34
+ /^output\.[a-z0-9._-]+(?:#l\d+(?:-\d+)?)?$/i,
35
+ /^\s*\{\s*$/,
36
+ /^\s*\}\s*$/,
37
+ /^\s*"[^"]*"\s*:\s*/,
38
+ ];
39
+ function isUiChromeLine(line) {
40
+ const trimmed = (line || '').trim();
41
+ if (!trimmed)
42
+ return false;
43
+ const lower = trimmed.toLowerCase();
44
+ if (UI_CHROME_LITERALS.has(lower))
45
+ return true;
46
+ for (const re of UI_CHROME_REGEXES) {
47
+ if (re.test(trimmed))
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ const FILE_REF_REGEX = /(?<![`/\\])(\b[a-zA-Z][\w.-]*(?:\/[\w.-]+)+(?::\d+(?:-\d+)?)?)\s?(?!`)/g;
53
+ /**
54
+ * Escape special HTML characters for Telegram HTML parse mode.
55
+ */
56
+ function escapeHtml(text) {
57
+ return text
58
+ .replace(/&/g, '&amp;')
59
+ .replace(/</g, '&lt;')
60
+ .replace(/>/g, '&gt;');
61
+ }
62
+ /**
63
+ * Format text for Telegram HTML display.
64
+ * Converts Markdown syntax to Telegram HTML, wraps table/tree lines in <pre>,
65
+ * and file references in <code>.
66
+ */
67
+ function formatForTelegram(text) {
68
+ const lines = text.split('\n');
69
+ const result = [];
70
+ let inSpecialBlock = false;
71
+ let inCodeBlock = false;
72
+ let codeBlockHasLang = false;
73
+ let inBlockquote = false;
74
+ const blockquoteLines = [];
75
+ const flushBlockquote = () => {
76
+ if (blockquoteLines.length > 0) {
77
+ result.push(`<blockquote>${blockquoteLines.join('\n')}</blockquote>`);
78
+ blockquoteLines.length = 0;
79
+ }
80
+ inBlockquote = false;
81
+ };
82
+ for (let i = 0; i < lines.length; i++) {
83
+ const line = lines[i];
84
+ const trimmed = line.trim();
85
+ if (trimmed.startsWith('```')) {
86
+ if (inBlockquote)
87
+ flushBlockquote();
88
+ inCodeBlock = !inCodeBlock;
89
+ if (inCodeBlock) {
90
+ const lang = trimmed.slice(3).trim();
91
+ codeBlockHasLang = !!lang;
92
+ result.push(lang ? `<pre><code class="language-${escapeHtml(lang)}">` : '<pre>');
93
+ }
94
+ else {
95
+ result.push(codeBlockHasLang ? '</code></pre>' : '</pre>');
96
+ codeBlockHasLang = false;
97
+ }
98
+ continue;
99
+ }
100
+ if (inCodeBlock) {
101
+ result.push(escapeHtml(line));
102
+ continue;
103
+ }
104
+ const isTableLine = (trimmed.startsWith('|') && trimmed.endsWith('|') && trimmed.length > 2) ||
105
+ /^\|[\s\-:]+\|/.test(trimmed);
106
+ const isTreeLine = /[├└│┌┐┘┤┬┴┼]/.test(line) ||
107
+ /^\s*[│├└]\s*──/.test(line) ||
108
+ /^\s*\|.*──/.test(line);
109
+ const isSpecialLine = isTableLine || isTreeLine;
110
+ // Blockquote lines: > text
111
+ if (trimmed.startsWith('>') && !isSpecialLine) {
112
+ if (inSpecialBlock) {
113
+ result.push('</pre>');
114
+ inSpecialBlock = false;
115
+ }
116
+ inBlockquote = true;
117
+ const quoteContent = trimmed.replace(/^>\s?/, '');
118
+ blockquoteLines.push(formatMarkdownLine(escapeHtml(quoteContent)));
119
+ continue;
120
+ }
121
+ else if (inBlockquote) {
122
+ flushBlockquote();
123
+ }
124
+ if (isSpecialLine && !inSpecialBlock) {
125
+ result.push('<pre>');
126
+ inSpecialBlock = true;
127
+ result.push(escapeHtml(line));
128
+ }
129
+ else if (isSpecialLine && inSpecialBlock) {
130
+ result.push(escapeHtml(line));
131
+ }
132
+ else if (!isSpecialLine && inSpecialBlock) {
133
+ result.push('</pre>');
134
+ inSpecialBlock = false;
135
+ result.push(formatMarkdownLine(wrapFileReferences(escapeHtml(line))));
136
+ }
137
+ else {
138
+ result.push(formatMarkdownLine(wrapFileReferences(escapeHtml(line))));
139
+ }
140
+ }
141
+ if (inBlockquote)
142
+ flushBlockquote();
143
+ if (inSpecialBlock) {
144
+ result.push('</pre>');
145
+ }
146
+ if (inCodeBlock) {
147
+ result.push(codeBlockHasLang ? '</code></pre>' : '</pre>');
148
+ }
149
+ return result.join('\n');
150
+ }
151
+ /**
152
+ * Convert Markdown inline/line-level syntax to Telegram HTML.
153
+ * Expects input that is already HTML-escaped.
154
+ */
155
+ function formatMarkdownLine(line) {
156
+ let result = line;
157
+ // Headings: ### Title → <b>Title</b>
158
+ const headingMatch = result.match(/^(#{1,6})\s+(.+)$/);
159
+ if (headingMatch) {
160
+ return `<b>${headingMatch[2]}</b>`;
161
+ }
162
+ // Horizontal rule: --- or *** or ___ → ---
163
+ if (/^(?:---+|\*\*\*+|___+)\s*$/.test(result.trim())) {
164
+ return '---';
165
+ }
166
+ // Inline code: `code` → <code>code</code> (must be before bold/italic)
167
+ result = result.replace(/`([^`]+)`/g, '<code>$1</code>');
168
+ // Links: [text](url) → <a href="url">text</a>
169
+ result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
170
+ // Bold: **text** or __text__ → <b>text</b>
171
+ result = result.replace(/\*\*(.+?)\*\*/g, '<b>$1</b>');
172
+ result = result.replace(/__(.+?)__/g, '<b>$1</b>');
173
+ // Italic: *text* or _text_ → <i>text</i> (but not inside words for _)
174
+ result = result.replace(/(?<!\w)\*([^*]+)\*(?!\w)/g, '<i>$1</i>');
175
+ result = result.replace(/(?<!\w)_([^_]+)_(?!\w)/g, '<i>$1</i>');
176
+ // Strikethrough: ~~text~~ → <s>text</s>
177
+ result = result.replace(/~~(.+?)~~/g, '<s>$1</s>');
178
+ return result;
179
+ }
180
+ function wrapFileReferences(line) {
181
+ return line.replace(FILE_REF_REGEX, '<code>$1</code>');
182
+ }
183
+ function isMcpFormatLine(line) {
184
+ return /^[a-z0-9._-]+\s*\/\s*[a-z0-9._-]+$/i.test(line);
185
+ }
186
+ function isActivityLogLine(line) {
187
+ const trimmed = (line || '').trim();
188
+ if (!trimmed)
189
+ return false;
190
+ return /^(?:analy[sz]ing|reading|writing|running|searching|planning|thinking|processing|loading|executing|testing|debugging|analyzed|read|wrote|ran)\s+.+/i.test(trimmed)
191
+ && trimmed.length <= 220;
192
+ }
193
+ function splitOutputAndLogs(rawText) {
194
+ const normalized = (rawText || '').replace(/\r/g, '');
195
+ if (!normalized.trim()) {
196
+ return { output: '', logs: '' };
197
+ }
198
+ const lines = normalized.split('\n');
199
+ const classes = [];
200
+ let inCodeBlock = false;
201
+ for (const line of lines) {
202
+ const trimmed = (line || '').trim();
203
+ if (trimmed.startsWith('```')) {
204
+ inCodeBlock = !inCodeBlock;
205
+ classes.push('code');
206
+ continue;
207
+ }
208
+ if (inCodeBlock) {
209
+ classes.push('code');
210
+ continue;
211
+ }
212
+ if (!trimmed) {
213
+ classes.push('blank');
214
+ continue;
215
+ }
216
+ if (isUiChromeLine(trimmed) || isActivityLogLine(trimmed)) {
217
+ classes.push('chrome');
218
+ }
219
+ else {
220
+ classes.push('output');
221
+ }
222
+ }
223
+ const hasMcpCalls = lines.some((l, i) => classes[i] === 'chrome' && isMcpFormatLine(l.trim()));
224
+ if (!hasMcpCalls) {
225
+ const outputLines = [];
226
+ const logLines = [];
227
+ for (let i = 0; i < lines.length; i++) {
228
+ if (classes[i] === 'chrome') {
229
+ logLines.push(lines[i].trim());
230
+ }
231
+ else {
232
+ outputLines.push(lines[i]);
233
+ }
234
+ }
235
+ return {
236
+ output: collapseBlankLines(outputLines.join('\n')),
237
+ logs: collapseBlankLines(logLines.join('\n')),
238
+ };
239
+ }
240
+ let lastOutputEnd = -1;
241
+ for (let i = lines.length - 1; i >= 0; i--) {
242
+ if (classes[i] === 'output' || classes[i] === 'code') {
243
+ lastOutputEnd = i;
244
+ break;
245
+ }
246
+ }
247
+ if (lastOutputEnd === -1) {
248
+ const logLines = lines.filter((_, i) => classes[i] === 'chrome').map((l) => l.trim());
249
+ return { output: '', logs: collapseBlankLines(logLines.join('\n')) };
250
+ }
251
+ let lastOutputStart = lastOutputEnd;
252
+ for (let i = lastOutputEnd - 1; i >= 0; i--) {
253
+ if (classes[i] === 'blank' || classes[i] === 'chrome')
254
+ break;
255
+ if (classes[i] === 'output' || classes[i] === 'code')
256
+ lastOutputStart = i;
257
+ }
258
+ const outputLines = [];
259
+ const logLines = [];
260
+ for (let i = 0; i < lines.length; i++) {
261
+ if (i >= lastOutputStart && i <= lastOutputEnd) {
262
+ if (classes[i] !== 'chrome')
263
+ outputLines.push(lines[i]);
264
+ else
265
+ logLines.push(lines[i].trim());
266
+ }
267
+ else if (classes[i] === 'chrome' || classes[i] === 'output') {
268
+ logLines.push(lines[i].trim());
269
+ }
270
+ }
271
+ return {
272
+ output: collapseBlankLines(outputLines.join('\n')),
273
+ logs: collapseBlankLines(logLines.join('\n')),
274
+ };
275
+ }
276
+ function collapseBlankLines(text) {
277
+ return text.replace(/\n{3,}/g, '\n\n').trim();
278
+ }
279
+ function separateOutputForDelivery(options) {
280
+ const { rawText, domSource, domOutputText, domActivityLines } = options;
281
+ if (domSource === 'dom-structured' && domOutputText !== undefined) {
282
+ return {
283
+ source: 'dom-structured',
284
+ output: domOutputText,
285
+ logs: (domActivityLines ?? []).join('\n'),
286
+ };
287
+ }
288
+ const separated = splitOutputAndLogs(rawText);
289
+ return { source: 'legacy-fallback', output: separated.output, logs: separated.logs };
290
+ }
291
+ /**
292
+ * Split an HTML-formatted string into multiple Telegram-safe chunks.
293
+ * Respects HTML tag boundaries — unclosed tags at chunk end are closed
294
+ * and reopened at the start of the next chunk.
295
+ *
296
+ * Supported tags: <pre>, <code>, <b>, <i>, <pre><code ...>
297
+ */
298
+ function splitTelegramHtml(html, maxLen = 4096) {
299
+ if (html.length <= maxLen)
300
+ return [html];
301
+ const lines = html.split('\n');
302
+ const chunks = [];
303
+ let current = '';
304
+ const openTags = []; // stack of currently open tags (raw opening tags)
305
+ const closingFor = (tag) => {
306
+ const name = tag.match(/^<(\w+)/)?.[1];
307
+ return name ? `</${name}>` : '';
308
+ };
309
+ const flush = () => {
310
+ if (!current)
311
+ return;
312
+ // Close any open tags at chunk end
313
+ let suffix = '';
314
+ for (let i = openTags.length - 1; i >= 0; i--) {
315
+ suffix += closingFor(openTags[i]);
316
+ }
317
+ chunks.push(current + suffix);
318
+ // Reopen tags at next chunk start
319
+ current = openTags.join('');
320
+ };
321
+ const trackTags = (line) => {
322
+ // Track opening and closing HTML tags
323
+ const tagRegex = /<\/?(\w+)(?:\s[^>]*)?\s*\/?>/g;
324
+ let match;
325
+ while ((match = tagRegex.exec(line)) !== null) {
326
+ const full = match[0];
327
+ if (full.endsWith('/>'))
328
+ continue; // self-closing
329
+ const tagName = match[1].toLowerCase();
330
+ if (tagName === 'br')
331
+ continue; // void element
332
+ if (full.startsWith('</')) {
333
+ // Closing tag: pop matching open tag
334
+ for (let i = openTags.length - 1; i >= 0; i--) {
335
+ const openName = openTags[i].match(/^<(\w+)/)?.[1]?.toLowerCase();
336
+ if (openName === tagName) {
337
+ openTags.splice(i, 1);
338
+ break;
339
+ }
340
+ }
341
+ }
342
+ else {
343
+ openTags.push(full);
344
+ }
345
+ }
346
+ };
347
+ for (const line of lines) {
348
+ const candidate = current ? `${current}\n${line}` : line;
349
+ // Calculate how much space closing tags would need
350
+ let closingLen = 0;
351
+ for (let i = openTags.length - 1; i >= 0; i--) {
352
+ closingLen += closingFor(openTags[i]).length;
353
+ }
354
+ // Also account for closing tags that would be needed after adding this line
355
+ const tempTags = [...openTags];
356
+ const tempTagRegex = /<\/?(\w+)(?:\s[^>]*)?\s*\/?>/g;
357
+ let m;
358
+ while ((m = tempTagRegex.exec(line)) !== null) {
359
+ const full = m[0];
360
+ if (full.endsWith('/>'))
361
+ continue;
362
+ const tagName = m[1].toLowerCase();
363
+ if (tagName === 'br')
364
+ continue;
365
+ if (full.startsWith('</')) {
366
+ for (let j = tempTags.length - 1; j >= 0; j--) {
367
+ const openName = tempTags[j].match(/^<(\w+)/)?.[1]?.toLowerCase();
368
+ if (openName === tagName) {
369
+ tempTags.splice(j, 1);
370
+ break;
371
+ }
372
+ }
373
+ }
374
+ else {
375
+ tempTags.push(full);
376
+ }
377
+ }
378
+ let newClosingLen = 0;
379
+ for (let i = tempTags.length - 1; i >= 0; i--) {
380
+ newClosingLen += closingFor(tempTags[i]).length;
381
+ }
382
+ if (candidate.length + newClosingLen <= maxLen) {
383
+ current = candidate;
384
+ trackTags(line);
385
+ continue;
386
+ }
387
+ // Current chunk is full — flush it
388
+ if (current) {
389
+ flush();
390
+ }
391
+ // If this single line fits in a fresh chunk
392
+ const reopenLen = openTags.join('').length;
393
+ if (reopenLen + line.length + newClosingLen <= maxLen) {
394
+ current = openTags.join('') + line;
395
+ trackTags(line);
396
+ continue;
397
+ }
398
+ // Hard-split a very long line
399
+ let available = maxLen - reopenLen - newClosingLen;
400
+ if (available <= 0) {
401
+ // Edge case: tag overhead alone exceeds limit — just push the line as-is
402
+ current = openTags.join('') + line;
403
+ trackTags(line);
404
+ flush();
405
+ continue;
406
+ }
407
+ let cursor = 0;
408
+ while (cursor < line.length) {
409
+ const slice = line.slice(cursor, cursor + available);
410
+ current = openTags.join('') + slice;
411
+ trackTags(slice);
412
+ cursor += available;
413
+ if (cursor < line.length) {
414
+ flush();
415
+ // Recalculate available space since openTags may have changed
416
+ let updatedClosingLen = 0;
417
+ for (let i = openTags.length - 1; i >= 0; i--) {
418
+ updatedClosingLen += closingFor(openTags[i]).length;
419
+ }
420
+ available = maxLen - openTags.join('').length - updatedClosingLen;
421
+ if (available <= 0)
422
+ available = 1; // prevent infinite loop
423
+ }
424
+ }
425
+ }
426
+ // Flush remaining
427
+ if (current) {
428
+ let suffix = '';
429
+ for (let i = openTags.length - 1; i >= 0; i--) {
430
+ suffix += closingFor(openTags[i]);
431
+ }
432
+ chunks.push(current + suffix);
433
+ }
434
+ return chunks.length > 0 ? chunks : [html];
435
+ }
436
+ function sanitizeActivityLines(raw) {
437
+ const lines = (raw || '')
438
+ .replace(/\r/g, '')
439
+ .split('\n')
440
+ .map((line) => line.trim())
441
+ .filter((line) => line.length > 0);
442
+ const kept = lines.filter((line) => !isUiChromeLine(line));
443
+ return Array.from(new Set(kept)).join('\n');
444
+ }
445
+ //# sourceMappingURL=telegramFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegramFormatter.js","sourceRoot":"","sources":["../../src/utils/telegramFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Check whether Whisper transcription is available.
3
+ * Returns null if ready, or a user-facing setup message if not.
4
+ */
5
+ export declare function checkWhisperAvailability(): string | null;
6
+ export interface TelegramVoiceInfo {
7
+ file_id: string;
8
+ file_unique_id: string;
9
+ duration: number;
10
+ mime_type?: string;
11
+ file_size?: number;
12
+ }
13
+ /**
14
+ * Download a voice message OGG file from the Telegram Bot API to a local temp directory.
15
+ */
16
+ export declare function downloadTelegramVoice(botApi: {
17
+ getFile: (fileId: string) => Promise<any>;
18
+ }, botToken: string, voice: TelegramVoiceInfo): Promise<string>;
19
+ /**
20
+ * Transcribe a voice file using nodejs-whisper (whisper.cpp bindings).
21
+ * Returns the trimmed transcript string, or null if transcription fails.
22
+ */
23
+ export declare function transcribeVoice(voicePath: string): Promise<string | null>;