instar 0.28.73 → 0.28.74

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 (43) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +51 -23
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/SessionManager.d.ts +4 -0
  5. package/dist/core/SessionManager.d.ts.map +1 -1
  6. package/dist/core/SessionManager.js +15 -4
  7. package/dist/core/SessionManager.js.map +1 -1
  8. package/dist/core/types.d.ts +15 -0
  9. package/dist/core/types.d.ts.map +1 -1
  10. package/dist/core/types.js.map +1 -1
  11. package/dist/lifeline/TelegramLifeline.d.ts +8 -0
  12. package/dist/lifeline/TelegramLifeline.d.ts.map +1 -1
  13. package/dist/lifeline/TelegramLifeline.js +31 -1
  14. package/dist/lifeline/TelegramLifeline.js.map +1 -1
  15. package/dist/messaging/TelegramAdapter.d.ts +28 -0
  16. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  17. package/dist/messaging/TelegramAdapter.js +79 -1
  18. package/dist/messaging/TelegramAdapter.js.map +1 -1
  19. package/dist/messaging/TelegramMarkdownFormatter.d.ts +76 -0
  20. package/dist/messaging/TelegramMarkdownFormatter.d.ts.map +1 -0
  21. package/dist/messaging/TelegramMarkdownFormatter.js +493 -0
  22. package/dist/messaging/TelegramMarkdownFormatter.js.map +1 -0
  23. package/dist/messaging/imessage/IMessageAdapter.d.ts +3 -6
  24. package/dist/messaging/imessage/IMessageAdapter.d.ts.map +1 -1
  25. package/dist/messaging/imessage/IMessageAdapter.js +20 -21
  26. package/dist/messaging/imessage/IMessageAdapter.js.map +1 -1
  27. package/dist/messaging/imessage/NativeBackend.d.ts +26 -0
  28. package/dist/messaging/imessage/NativeBackend.d.ts.map +1 -1
  29. package/dist/messaging/imessage/NativeBackend.js +133 -0
  30. package/dist/messaging/imessage/NativeBackend.js.map +1 -1
  31. package/dist/messaging/telegramFormatMetrics.d.ts +22 -0
  32. package/dist/messaging/telegramFormatMetrics.d.ts.map +1 -0
  33. package/dist/messaging/telegramFormatMetrics.js +38 -0
  34. package/dist/messaging/telegramFormatMetrics.js.map +1 -0
  35. package/dist/messaging/types.d.ts +7 -0
  36. package/dist/messaging/types.d.ts.map +1 -1
  37. package/dist/messaging/types.js.map +1 -1
  38. package/package.json +1 -1
  39. package/src/data/builtin-manifest.json +5 -5
  40. package/src/templates/scripts/telegram-reply.sh +52 -8
  41. package/upgrades/0.28.74.md +48 -0
  42. package/upgrades/side-effects/telegram-markdown-renderer-pr1.md +124 -0
  43. /package/upgrades/side-effects/{capability-map-user-provenance-fallback.md → 0.28.73.md} +0 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * TelegramMarkdownFormatter — server-side formatter that converts agent-authored
3
+ * GitHub-flavored markdown into Telegram HTML on outbound sends.
4
+ *
5
+ * Ported from Dawn's `telegram_format.py` (the-portal/.claude/scripts/telegram_format.py).
6
+ * Spec: docs/specs/TELEGRAM-MARKDOWN-RENDERER-SPEC.md
7
+ *
8
+ * PR1: module + tests only. Not wired into any send path. PR2 wires into
9
+ * TelegramAdapter.apiCall() and TelegramLifeline.apiCall() behind a canary flag.
10
+ */
11
+ export type FormatMode = 'plain' | 'html' | 'code' | 'markdown' | 'legacy-passthrough';
12
+ export interface FormatResult {
13
+ /** The rendered output text (or the raw input, for `legacy-passthrough`). */
14
+ text: string;
15
+ /**
16
+ * The parse_mode the caller should set on the Bot API call.
17
+ * - `'HTML'` for plain/html/code/markdown.
18
+ * - `undefined` for `legacy-passthrough` — caller MUST use its callsite-historical
19
+ * parse_mode (the formatter refuses to decide for legacy-passthrough).
20
+ */
21
+ parseMode: 'HTML' | 'Markdown' | undefined;
22
+ /** Lint issue strings (canonical prose; never contains user text). */
23
+ lintIssues: string[];
24
+ /** The mode actually applied (may differ from requested if conversionSkipped). */
25
+ modeApplied: FormatMode;
26
+ /** Output was byte-truncated to fit a Bot API limit. */
27
+ truncated: boolean;
28
+ /**
29
+ * Markdown conversion was bypassed (input > 32KB) and plain mode was applied.
30
+ * Distinct from `truncated` (which is byte-loss).
31
+ */
32
+ conversionSkipped: boolean;
33
+ /**
34
+ * For `legacy-passthrough`: signals to caller that formatter declined to
35
+ * transform the bytes; caller should use its historical parse_mode.
36
+ */
37
+ legacyPassthrough: boolean;
38
+ }
39
+ /** 32KB hard cap. Above this, markdown conversion is skipped (ReDoS defense). */
40
+ export declare const MAX_INPUT_LENGTH = 32768;
41
+ /** Escape for HTML text nodes. */
42
+ export declare function escapeHtmlText(s: string): string;
43
+ /**
44
+ * Escape for HTML attribute values (href). Distinct from text: also escapes
45
+ * quotes and strips control chars that could break attribute quoting.
46
+ */
47
+ export declare function escapeHtmlAttribute(s: string): string;
48
+ /**
49
+ * Check a URL against the scheme allowlist using WHATWG URL parsing.
50
+ * Returns the trimmed+parsed URL string on success, or null on reject.
51
+ *
52
+ * Scheme allowlist: http, https, tg, mailto. Everything else (javascript:,
53
+ * data:, file:, vbscript:, etc.) is refused and the link becomes literal text.
54
+ */
55
+ export declare function isSafeUrl(raw: string): string | null;
56
+ /**
57
+ * Lint — canonical messages only. Never contains user text.
58
+ */
59
+ export declare function lintTelegramMarkdown(text: string): string[];
60
+ /**
61
+ * Format text for Telegram send.
62
+ *
63
+ * See spec's "Modes — exact contract" and "Markdown conversion rules" sections.
64
+ */
65
+ export declare function formatForTelegram(text: string, mode?: FormatMode): FormatResult;
66
+ /**
67
+ * Convenience: `format(text, mode)` → `{ text, parseMode }` shape per the
68
+ * parent prompt. Full result available via `formatForTelegram()`.
69
+ */
70
+ export declare function format(text: string, mode?: FormatMode): {
71
+ text: string;
72
+ parseMode: 'HTML' | 'Markdown' | undefined;
73
+ };
74
+ /** Short alias for the lint function. */
75
+ export declare function lint(text: string): string[];
76
+ //# sourceMappingURL=TelegramMarkdownFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramMarkdownFormatter.d.ts","sourceRoot":"","sources":["../../src/messaging/TelegramMarkdownFormatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,MAAM,GACN,MAAM,GACN,UAAU,GACV,oBAAoB,CAAC;AAEzB,MAAM,WAAW,YAAY;IAC3B,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,sEAAsE;IACtE,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kFAAkF;IAClF,WAAW,EAAE,UAAU,CAAC;IACxB,wDAAwD;IACxD,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAuDvC,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CASrD;AAMD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAapD;AAqQD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB3D;AAoDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAuB,GAC5B,YAAY,CAoFd;AAED;;;GAGG;AACH,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,UAAuB,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAG9D;AAED,yCAAyC;AACzC,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE3C"}
@@ -0,0 +1,493 @@
1
+ /**
2
+ * TelegramMarkdownFormatter — server-side formatter that converts agent-authored
3
+ * GitHub-flavored markdown into Telegram HTML on outbound sends.
4
+ *
5
+ * Ported from Dawn's `telegram_format.py` (the-portal/.claude/scripts/telegram_format.py).
6
+ * Spec: docs/specs/TELEGRAM-MARKDOWN-RENDERER-SPEC.md
7
+ *
8
+ * PR1: module + tests only. Not wired into any send path. PR2 wires into
9
+ * TelegramAdapter.apiCall() and TelegramLifeline.apiCall() behind a canary flag.
10
+ */
11
+ /** 32KB hard cap. Above this, markdown conversion is skipped (ReDoS defense). */
12
+ export const MAX_INPUT_LENGTH = 32_768;
13
+ /** Safe bound for quantifier in italic regex (ReDoS defense). */
14
+ const ITALIC_MAX_LEN = 200;
15
+ /** Max chars scanned forward in the balanced-paren URL walker. */
16
+ const URL_SCAN_MAX = 2048;
17
+ // ─── Placeholder sentinels ──────────────────────────────────────────────────
18
+ // Use Supplementary-PUA-B (U+100000..U+10FFFD) — near-zero real-world usage,
19
+ // invalid in Telegram HTML text anyway. We strip this range from user input
20
+ // BEFORE inserting any sentinel, so collision is structurally impossible.
21
+ // PUA-A (U+E000..U+F8FF) is NOT used — it frequently collides with user input
22
+ // (private emoji, legacy fonts).
23
+ // Supplementary-PUA-B is U+100000..U+10FFFD (codepoint max is 0x10FFFF).
24
+ // We carve three 20000-wide blocks, one per kind.
25
+ const PUA_B_START = 0x100000;
26
+ const BLOCK_SIZE = 0x5000; // 20480 entries per kind — plenty
27
+ const SENTINEL_CLOSE = String.fromCodePoint(0x10fffd);
28
+ const KIND_PRE = 0;
29
+ const KIND_TABLE = 1;
30
+ const KIND_CODE = 2;
31
+ function makeSentinel(kind, n) {
32
+ if (n < 0 || n >= BLOCK_SIZE) {
33
+ throw new Error(`sentinel index out of range: ${n}`);
34
+ }
35
+ const code = PUA_B_START + kind * BLOCK_SIZE + n;
36
+ return SENTINEL_CLOSE + String.fromCodePoint(code) + SENTINEL_CLOSE;
37
+ }
38
+ function decodeSentinelCodepoint(cp) {
39
+ const offset = cp - PUA_B_START;
40
+ if (offset < 0)
41
+ return null;
42
+ const kind = Math.floor(offset / BLOCK_SIZE);
43
+ const n = offset % BLOCK_SIZE;
44
+ if (kind > 2)
45
+ return null;
46
+ return { kind, n };
47
+ }
48
+ /** Strip the entire Supplementary-PUA-B range from user input. */
49
+ function stripPuaB(s) {
50
+ // Two-surrogate range: 0x100000..0x10FFFD. Regex with /u flag.
51
+ return s.replace(/[\u{100000}-\u{10FFFD}]/gu, '');
52
+ }
53
+ /** Strip NUL bytes. Always step 0. */
54
+ function stripNul(s) {
55
+ return s.replace(/\x00/g, '');
56
+ }
57
+ // ─── HTML escape ────────────────────────────────────────────────────────────
58
+ /** Escape for HTML text nodes. */
59
+ export function escapeHtmlText(s) {
60
+ return s
61
+ .replace(/&/g, '&amp;')
62
+ .replace(/</g, '&lt;')
63
+ .replace(/>/g, '&gt;');
64
+ }
65
+ /**
66
+ * Escape for HTML attribute values (href). Distinct from text: also escapes
67
+ * quotes and strips control chars that could break attribute quoting.
68
+ */
69
+ export function escapeHtmlAttribute(s) {
70
+ return s
71
+ // Strip C0 controls + DEL + CR/LF (CR/LF already in C0 range).
72
+ .replace(/[\x00-\x1f\x7f]/g, '')
73
+ .replace(/&/g, '&amp;')
74
+ .replace(/"/g, '&quot;')
75
+ .replace(/'/g, '&#39;')
76
+ .replace(/</g, '&lt;')
77
+ .replace(/>/g, '&gt;');
78
+ }
79
+ // ─── URL safety ─────────────────────────────────────────────────────────────
80
+ const SAFE_SCHEMES = new Set(['http', 'https', 'tg', 'mailto']);
81
+ /**
82
+ * Check a URL against the scheme allowlist using WHATWG URL parsing.
83
+ * Returns the trimmed+parsed URL string on success, or null on reject.
84
+ *
85
+ * Scheme allowlist: http, https, tg, mailto. Everything else (javascript:,
86
+ * data:, file:, vbscript:, etc.) is refused and the link becomes literal text.
87
+ */
88
+ export function isSafeUrl(raw) {
89
+ // Trim leading whitespace and C0 controls (URL smuggling defense).
90
+ const trimmed = raw.replace(/^[\s\x00-\x1f]+/, '');
91
+ if (!trimmed)
92
+ return null;
93
+ let parsed;
94
+ try {
95
+ parsed = new URL(trimmed);
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ const scheme = parsed.protocol.toLowerCase().replace(':', '');
101
+ if (!SAFE_SCHEMES.has(scheme))
102
+ return null;
103
+ return trimmed;
104
+ }
105
+ /**
106
+ * Step 2: extract fenced code blocks. Replaces each with a PUA sentinel.
107
+ * Inner content HTML-escaped, wrapped in <pre>.
108
+ */
109
+ function extractFencedCode(text, pre) {
110
+ // Bounded fence regex: ``` ... ```, non-greedy.
111
+ // Use a manual scan to avoid regex backtracking on unbalanced fences.
112
+ const out = [];
113
+ let i = 0;
114
+ while (i < text.length) {
115
+ if (text.startsWith('```', i)) {
116
+ // Find closing ```
117
+ const start = i + 3;
118
+ const end = text.indexOf('```', start);
119
+ if (end === -1) {
120
+ // No closing — emit literal backticks, keep scanning.
121
+ out.push('```');
122
+ i += 3;
123
+ continue;
124
+ }
125
+ // Optional language tag on the opening line (skip to first \n).
126
+ let contentStart = start;
127
+ const nl = text.indexOf('\n', start);
128
+ if (nl !== -1 && nl < end) {
129
+ contentStart = nl + 1;
130
+ }
131
+ const inner = text.slice(contentStart, end);
132
+ const idx = pre.length;
133
+ pre.push(`<pre>${escapeHtmlText(inner)}</pre>`);
134
+ out.push(makeSentinel(KIND_PRE, idx));
135
+ i = end + 3;
136
+ }
137
+ else {
138
+ out.push(text[i]);
139
+ i++;
140
+ }
141
+ }
142
+ return out.join('');
143
+ }
144
+ /**
145
+ * Step 3: extract markdown table blocks. Requires both pipe-rows and an
146
+ * alignment separator row. Escape inner text, wrap whole block in <pre>.
147
+ */
148
+ function extractTables(text, table) {
149
+ const lines = text.split('\n');
150
+ const isRow = (s) => /^\s*\|.{1,2000}\|\s*$/.test(s);
151
+ const isSep = (s) => /^\s*\|[\s\-:|]{1,2000}\|\s*$/.test(s);
152
+ const out = [];
153
+ let i = 0;
154
+ while (i < lines.length) {
155
+ if (isRow(lines[i])) {
156
+ const block = [];
157
+ let hasSep = false;
158
+ let j = i;
159
+ while (j < lines.length && isRow(lines[j])) {
160
+ if (isSep(lines[j])) {
161
+ hasSep = true;
162
+ }
163
+ else {
164
+ block.push(lines[j]);
165
+ }
166
+ j++;
167
+ }
168
+ if (hasSep && block.length > 0) {
169
+ const escaped = block.map(escapeHtmlText).join('\n');
170
+ const idx = table.length;
171
+ table.push(`<pre>${escaped}</pre>`);
172
+ out.push(makeSentinel(KIND_TABLE, idx));
173
+ i = j;
174
+ continue;
175
+ }
176
+ }
177
+ out.push(lines[i]);
178
+ i++;
179
+ }
180
+ return out.join('\n');
181
+ }
182
+ /**
183
+ * Step 4: extract inline code spans (`x`). Non-greedy, newline-bounded.
184
+ */
185
+ function extractInlineCode(text, code) {
186
+ // Bounded quantifier; no nested backticks; newline terminates.
187
+ return text.replace(/`([^`\n]{1,500})`/g, (_m, inner) => {
188
+ const idx = code.length;
189
+ code.push(`<code>${escapeHtmlText(inner)}</code>`);
190
+ return makeSentinel(KIND_CODE, idx);
191
+ });
192
+ }
193
+ // ─── Link scanner (balanced-paren; not regex) ───────────────────────────────
194
+ /**
195
+ * Step 11: find `[text](url)` links with a balanced-paren URL scanner so
196
+ * Wikipedia-style URLs like `https://en.wikipedia.org/wiki/Entity_(computer_science)`
197
+ * parse correctly.
198
+ *
199
+ * Input: text where prose is already HTML-escaped (step 5 ran).
200
+ * `[`, `]`, `(`, `)` survive escape.
201
+ */
202
+ function convertLinks(text) {
203
+ const out = [];
204
+ let i = 0;
205
+ while (i < text.length) {
206
+ const ch = text[i];
207
+ if (ch !== '[') {
208
+ out.push(ch);
209
+ i++;
210
+ continue;
211
+ }
212
+ // Find matching ] on same line, with bounded length.
213
+ let j = i + 1;
214
+ let foundClose = -1;
215
+ const maxTextEnd = Math.min(text.length, i + 1 + 500);
216
+ while (j < maxTextEnd) {
217
+ const c = text[j];
218
+ if (c === '\n')
219
+ break;
220
+ if (c === ']') {
221
+ foundClose = j;
222
+ break;
223
+ }
224
+ j++;
225
+ }
226
+ if (foundClose === -1 || text[foundClose + 1] !== '(') {
227
+ out.push(ch);
228
+ i++;
229
+ continue;
230
+ }
231
+ const visibleText = text.slice(i + 1, foundClose);
232
+ // Walk URL with paren balance.
233
+ let k = foundClose + 2;
234
+ let depth = 1;
235
+ const urlStart = k;
236
+ const scanEnd = Math.min(text.length, urlStart + URL_SCAN_MAX);
237
+ let urlEnd = -1;
238
+ while (k < scanEnd) {
239
+ const c = text[k];
240
+ if (c === '\n')
241
+ break;
242
+ if (c === '\\' && k + 1 < scanEnd) {
243
+ // Backslash: skip next char as literal (does NOT count parens).
244
+ k += 2;
245
+ continue;
246
+ }
247
+ if (c === '(')
248
+ depth++;
249
+ else if (c === ')') {
250
+ depth--;
251
+ if (depth === 0) {
252
+ urlEnd = k;
253
+ break;
254
+ }
255
+ }
256
+ k++;
257
+ }
258
+ if (urlEnd === -1) {
259
+ // Unbalanced — emit literal prefix `[text](` and keep scanning from
260
+ // right after the `(`.
261
+ out.push(text.slice(i, foundClose + 2));
262
+ i = foundClose + 2;
263
+ continue;
264
+ }
265
+ const rawUrl = text.slice(urlStart, urlEnd);
266
+ const safeUrl = isSafeUrl(rawUrl);
267
+ if (safeUrl === null) {
268
+ // Emit the original construct as literal.
269
+ out.push(text.slice(i, urlEnd + 1));
270
+ i = urlEnd + 1;
271
+ continue;
272
+ }
273
+ out.push(`<a href="${escapeHtmlAttribute(safeUrl)}">${visibleText}</a>`);
274
+ i = urlEnd + 1;
275
+ }
276
+ return out.join('');
277
+ }
278
+ // ─── Emphasis/headings/bullets ──────────────────────────────────────────────
279
+ /**
280
+ * Step 6 bold-italic, step 7 bold, step 8 italic (tightened).
281
+ *
282
+ * Order is load-bearing: triple BEFORE double BEFORE single so `***x***` parses
283
+ * as <b><i>x</i></b>, not `**` + `*x*` + `**`.
284
+ */
285
+ function applyEmphasis(text) {
286
+ // Bold-italic (triple asterisk). Bounded quantifier.
287
+ text = text.replace(/\*\*\*([^*\n]{1,200}?)\*\*\*/g, '<b><i>$1</i></b>');
288
+ // Bold (double asterisk).
289
+ text = text.replace(/\*\*([^*\n]{1,200}?)\*\*/g, '<b>$1</b>');
290
+ // Italic — tightened boundary. Requires word-boundary-like context on both
291
+ // sides. Does NOT match `3*5`, `f(x) = x * y`, `a*b*c`.
292
+ // Using bounded quantifier (ReDoS defense).
293
+ text = text.replace(/(^|[\s(,.;:!?])\*(?!\s)([^*\n]{1,200}?)(?<!\s)\*(?=$|[\s),.;:!?])/g, '$1<i>$2</i>');
294
+ return text;
295
+ }
296
+ /** Step 9: headings → <b>. Telegram supports bold, not h1-h6. */
297
+ function applyHeadings(text) {
298
+ return text.replace(/^(#{1,6})\s+(.{1,2000}?)\s*#*\s*$/gm, '<b>$2</b>');
299
+ }
300
+ /** Step 10: bullets → • */
301
+ function applyBullets(text) {
302
+ return text.replace(/^(\s{0,20})[-*+]\s+/gm, '$1• ');
303
+ }
304
+ // ─── Plain mode (Dawn parity) ──────────────────────────────────────────────
305
+ function plainUnicode(text) {
306
+ // Heading: uppercase the heading text.
307
+ text = text.replace(/^(#{1,6})\s+(.{1,2000}?)\s*#*\s*$/gm, (_m, _h, t) => t.toUpperCase());
308
+ text = text.replace(/\*\*\*([^*\n]{1,200}?)\*\*\*/g, '$1');
309
+ text = text.replace(/\*\*([^*\n]{1,200}?)\*\*/g, '$1');
310
+ text = text.replace(/(^|[\s(,.;:!?])\*(?!\s)([^*\n]{1,200}?)(?<!\s)\*(?=$|[\s),.;:!?])/g, '$1$2');
311
+ text = text.replace(/`([^`\n]{1,500})`/g, "'$1'");
312
+ text = text.replace(/^(\s{0,20})[-*+]\s+/gm, '$1• ');
313
+ return text;
314
+ }
315
+ // ─── Lint ───────────────────────────────────────────────────────────────────
316
+ /**
317
+ * Strip <code>...</code> and <pre>...</pre> spans so lint doesn't flag markdown
318
+ * chars inside deliberately-literal examples.
319
+ *
320
+ * ADVISORY-ONLY — not used by the converter. The converter has its own
321
+ * tokenizer (extractFencedCode / extractInlineCode).
322
+ */
323
+ function stripHtmlCodePreForLint(text) {
324
+ // Bounded quantifiers; non-greedy.
325
+ text = text.replace(/<pre>[\s\S]{0,32000}?<\/pre>/g, '');
326
+ text = text.replace(/<code>[\s\S]{0,2000}?<\/code>/g, '');
327
+ return text;
328
+ }
329
+ /**
330
+ * Lint — canonical messages only. Never contains user text.
331
+ */
332
+ export function lintTelegramMarkdown(text) {
333
+ const stripped = stripHtmlCodePreForLint(text);
334
+ const issues = [];
335
+ // Table: requires BOTH a row and an alignment separator.
336
+ const hasTableRow = /^\s*\|.{1,2000}\|\s*$/m.test(stripped);
337
+ const hasTableSep = /^\s*\|[\s\-:|]{1,2000}\|\s*$/m.test(stripped);
338
+ if (hasTableRow && hasTableSep) {
339
+ issues.push('markdown table syntax detected (pipe rows with alignment separator)');
340
+ }
341
+ if (/\*\*([^*\n]{1,200}?)\*\*/.test(stripped)) {
342
+ issues.push('markdown bold syntax detected (double-asterisk)');
343
+ }
344
+ if (/^#{1,6}\s+.{1,2000}$/m.test(stripped)) {
345
+ issues.push('markdown heading syntax detected (leading hash)');
346
+ }
347
+ // Nested markdown: bold-inside-bold or italic-inside-bold literal concern.
348
+ if (/\*\*[^*\n]{0,200}\*[^*\n]{0,200}\*[^*\n]{0,200}\*\*/.test(stripped)) {
349
+ issues.push('nested markdown emphasis detected');
350
+ }
351
+ return issues;
352
+ }
353
+ // ─── Main entry ─────────────────────────────────────────────────────────────
354
+ /**
355
+ * Convert GitHub-flavored markdown to Telegram HTML per spec's 12-step pipeline.
356
+ */
357
+ function convertMarkdownToHtml(text) {
358
+ const pre = [];
359
+ const table = [];
360
+ const code = [];
361
+ // Step 2: fenced code.
362
+ text = extractFencedCode(text, pre);
363
+ // Step 3: tables.
364
+ text = extractTables(text, table);
365
+ // Step 4: inline code.
366
+ text = extractInlineCode(text, code);
367
+ // Step 5: HTML-escape remaining prose.
368
+ text = escapeHtmlText(text);
369
+ // Steps 6-8: bold-italic, bold, italic.
370
+ text = applyEmphasis(text);
371
+ // Step 9: headings.
372
+ text = applyHeadings(text);
373
+ // Step 10: bullets.
374
+ text = applyBullets(text);
375
+ // Step 11: links (balanced-paren scan).
376
+ text = convertLinks(text);
377
+ // Step 12: splice placeholders back.
378
+ text = splicePlaceholders(text, pre, table, code);
379
+ return text;
380
+ }
381
+ function splicePlaceholders(text, pre, table, code) {
382
+ // Replace every sentinel pattern: SENTINEL_CLOSE + codepoint + SENTINEL_CLOSE.
383
+ const re = /\u{10FFFD}([\u{100000}-\u{10FFFC}])\u{10FFFD}/gu;
384
+ return text.replace(re, (_m, ch) => {
385
+ const cp = ch.codePointAt(0);
386
+ const dec = decodeSentinelCodepoint(cp);
387
+ if (!dec)
388
+ return '';
389
+ if (dec.kind === KIND_PRE)
390
+ return pre[dec.n] ?? '';
391
+ if (dec.kind === KIND_TABLE)
392
+ return table[dec.n] ?? '';
393
+ if (dec.kind === KIND_CODE)
394
+ return code[dec.n] ?? '';
395
+ return '';
396
+ });
397
+ }
398
+ /**
399
+ * Format text for Telegram send.
400
+ *
401
+ * See spec's "Modes — exact contract" and "Markdown conversion rules" sections.
402
+ */
403
+ export function formatForTelegram(text, mode = 'markdown') {
404
+ // legacy-passthrough: byte-for-byte unchanged, parseMode undefined so caller
405
+ // uses its historical mode.
406
+ if (mode === 'legacy-passthrough') {
407
+ return {
408
+ text,
409
+ parseMode: undefined,
410
+ lintIssues: [],
411
+ modeApplied: 'legacy-passthrough',
412
+ truncated: false,
413
+ conversionSkipped: false,
414
+ legacyPassthrough: true,
415
+ };
416
+ }
417
+ // Step 0: strip NUL. ALWAYS first.
418
+ let working = stripNul(text);
419
+ // Defensive: strip PUA-B to prevent sentinel collisions. Range is near-zero
420
+ // real-world usage and invalid in Telegram HTML anyway.
421
+ working = stripPuaB(working);
422
+ const lintIssues = lintTelegramMarkdown(working);
423
+ // Step 1: length guard (ReDoS defense). Applies to markdown conversion only.
424
+ if (mode === 'markdown' && working.length > MAX_INPUT_LENGTH) {
425
+ // Fall back to plain.
426
+ const plain = escapeHtmlText(plainUnicode(working));
427
+ return {
428
+ text: plain,
429
+ parseMode: 'HTML',
430
+ lintIssues,
431
+ modeApplied: 'plain',
432
+ truncated: false,
433
+ conversionSkipped: true,
434
+ legacyPassthrough: false,
435
+ };
436
+ }
437
+ if (mode === 'html') {
438
+ return {
439
+ text: working,
440
+ parseMode: 'HTML',
441
+ lintIssues,
442
+ modeApplied: 'html',
443
+ truncated: false,
444
+ conversionSkipped: false,
445
+ legacyPassthrough: false,
446
+ };
447
+ }
448
+ if (mode === 'code') {
449
+ return {
450
+ text: `<pre>${escapeHtmlText(working)}</pre>`,
451
+ parseMode: 'HTML',
452
+ lintIssues,
453
+ modeApplied: 'code',
454
+ truncated: false,
455
+ conversionSkipped: false,
456
+ legacyPassthrough: false,
457
+ };
458
+ }
459
+ if (mode === 'plain') {
460
+ return {
461
+ text: escapeHtmlText(plainUnicode(working)),
462
+ parseMode: 'HTML',
463
+ lintIssues,
464
+ modeApplied: 'plain',
465
+ truncated: false,
466
+ conversionSkipped: false,
467
+ legacyPassthrough: false,
468
+ };
469
+ }
470
+ // markdown (default)
471
+ return {
472
+ text: convertMarkdownToHtml(working),
473
+ parseMode: 'HTML',
474
+ lintIssues,
475
+ modeApplied: 'markdown',
476
+ truncated: false,
477
+ conversionSkipped: false,
478
+ legacyPassthrough: false,
479
+ };
480
+ }
481
+ /**
482
+ * Convenience: `format(text, mode)` → `{ text, parseMode }` shape per the
483
+ * parent prompt. Full result available via `formatForTelegram()`.
484
+ */
485
+ export function format(text, mode = 'markdown') {
486
+ const r = formatForTelegram(text, mode);
487
+ return { text: r.text, parseMode: r.parseMode };
488
+ }
489
+ /** Short alias for the lint function. */
490
+ export function lint(text) {
491
+ return lintTelegramMarkdown(text);
492
+ }
493
+ //# sourceMappingURL=TelegramMarkdownFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramMarkdownFormatter.js","sourceRoot":"","sources":["../../src/messaging/TelegramMarkdownFormatter.ts"],"names":[],"mappings":"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"}
@@ -42,7 +42,6 @@ export declare class IMessageAdapter implements MessagingAdapter {
42
42
  private readonly proactiveSendEnabled;
43
43
  private readonly reactiveWindowHours;
44
44
  private readonly triggerMode;
45
- private readonly directMessageTrigger;
46
45
  private agentName;
47
46
  private backend;
48
47
  private logger;
@@ -119,12 +118,10 @@ export declare class IMessageAdapter implements MessagingAdapter {
119
118
  getTriggerMode(): 'mention' | 'all';
120
119
  /**
121
120
  * Check whether an incoming message triggers the agent.
121
+ * In "mention" mode, requires @{agentName} in the message text — but only
122
+ * for group chats. 1:1 conversations always trigger regardless of mode,
123
+ * because mention gating only makes sense when multiple people are talking.
122
124
  * In "all" mode, every message triggers.
123
- * In "mention" mode, requires @{agentName} in the message text.
124
- * The directMessageTrigger config controls 1:1 chat behavior in mention mode:
125
- * - "mention" (default): require @{agentName} even in 1:1 chats (backward-compatible)
126
- * - "always": 1:1 chats bypass mention gating
127
- * - "off": 1:1 chats never trigger
128
125
  * Returns the stripped text (mention removed) if triggered.
129
126
  */
130
127
  _checkTrigger(text: string, chatId?: string): {
@@ -1 +1 @@
1
- {"version":3,"file":"IMessageAdapter.d.ts","sourceRoot":"","sources":["../../../src/messaging/imessage/IMessageAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IMessageAdapter.d.ts","sourceRoot":"","sources":["../../../src/messaging/imessage/IMessageAdapter.ts"],"names":[],"mappings":"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"}