diff --git a/lib/bridge.js b/lib/bridge.js index d976c1d..01c2e17 100644 --- a/lib/bridge.js +++ b/lib/bridge.js @@ -75,10 +75,8 @@ const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); const REASONING_QUOTE_MAX_CHARS = 800; /** * Assistant message → markdown for delivery. Reasoning (thinking) blocks are - * kept as EXPANDABLE quotes (`**>`…`||` per Telegram's native markdown spec, - * `
` in HTML mode) so they stay collapsed on the phone - * and visually distinct from tool-call quotes; ordinary quotes in assistant - * text remain plain blockquotes. + * kept, one `> ` quote line each — Telegram renders them as the accent-bar + * quote style the phone user expects for bash/thinking-style chatter. */ function contentToText(content) { const parts = []; @@ -92,13 +90,7 @@ function contentToText(content) { continue; if (thinking.length > REASONING_QUOTE_MAX_CHARS) thinking = `${thinking.slice(0, REASONING_QUOTE_MAX_CHARS)}…`; - // `||` would open/close spoiler entities in native markdown — neutralize. - const lines = thinking.replace(/\|\|/g, '||').split('\n'); - const last = lines.length - 1; - parts.push([ - '**>💭 思考过程', - ...lines.map((line, i) => `> ${line}${i === last ? '||' : ''}`), - ].join('\n')); + parts.push(thinking.split('\n').map((line) => `> ${line}`).join('\n')); } } return parts.join('\n\n'); diff --git a/lib/format.js b/lib/format.js index 729bbcb..4ac6ba8 100644 --- a/lib/format.js +++ b/lib/format.js @@ -12,54 +12,22 @@ function inlineToHtml(text) { html = html.replace(/\*\*([^*\n]+)\*\*/g, '$1'); return html; } -/** - * Convert `> …` line groups into `` (Telegram renders it with the - * accent-colored left bar). The native-markdown expandable-quote form - * (`**>first line` … `last line||`) becomes `` — used - * for thinking blocks so they stay collapsed and distinct from tool-call - * quotes (Telegram has no per-message quote color). - */ -const EXPANDABLE_OPEN = '**>'; +/** Convert `> …` line groups into `` (Telegram renders it with the accent-colored left bar). */ function blocksToHtml(text) { const lines = text.split('\n'); const out = []; let quote = []; - let expandable = false; const flush = () => { if (quote.length === 0) return; - const open = expandable ? '' : ''; - out.push(`${open}${inlineToHtml(quote.join('\n'))}`); + out.push(`${inlineToHtml(quote.join('\n'))}`); quote = []; - expandable = false; }; for (const line of lines) { - if (line.startsWith(EXPANDABLE_OPEN)) { - flush(); - expandable = true; - let content = line.slice(EXPANDABLE_OPEN.length); - if (content.endsWith('||')) { - quote.push(content.slice(0, -2)); - flush(); - } - else { - quote.push(content); - } - } - else if (line.startsWith('> ')) { - let content = line.slice(2); - let closed = false; - if (expandable && content.endsWith('||')) { - content = content.slice(0, -2); - closed = true; - } - quote.push(content); - if (closed) - flush(); - } - else if (line === '>') { + if (line.startsWith('> ')) + quote.push(line.slice(2)); + else if (line === '>') quote.push(''); - } else { flush(); out.push(inlineToHtml(line)); diff --git a/src/bridge.ts b/src/bridge.ts index 4a927e4..1427c5d 100644 --- a/src/bridge.ts +++ b/src/bridge.ts @@ -210,10 +210,8 @@ const REASONING_QUOTE_MAX_CHARS = 800 /** * Assistant message → markdown for delivery. Reasoning (thinking) blocks are - * kept as EXPANDABLE quotes (`**>`…`||` per Telegram's native markdown spec, - * `` in HTML mode) so they stay collapsed on the phone - * and visually distinct from tool-call quotes; ordinary quotes in assistant - * text remain plain blockquotes. + * kept, one `> ` quote line each — Telegram renders them as the accent-bar + * quote style the phone user expects for bash/thinking-style chatter. */ function contentToText(content: readonly ContentBlock[]): string { const parts: string[] = [] @@ -225,13 +223,7 @@ function contentToText(content: readonly ContentBlock[]): string { if (!thinking) continue if (thinking.length > REASONING_QUOTE_MAX_CHARS) thinking = `${thinking.slice(0, REASONING_QUOTE_MAX_CHARS)}…` - // `||` would open/close spoiler entities in native markdown — neutralize. - const lines = thinking.replace(/\|\|/g, '||').split('\n') - const last = lines.length - 1 - parts.push([ - '**>💭 思考过程', - ...lines.map((line, i) => `> ${line}${i === last ? '||' : ''}`), - ].join('\n')) + parts.push(thinking.split('\n').map((line) => `> ${line}`).join('\n')) } } return parts.join('\n\n') diff --git a/src/format.ts b/src/format.ts index b2b160d..0b0fa22 100644 --- a/src/format.ts +++ b/src/format.ts @@ -14,50 +14,20 @@ function inlineToHtml(text: string): string { return html } -/** - * Convert `> …` line groups into `` (Telegram renders it with the - * accent-colored left bar). The native-markdown expandable-quote form - * (`**>first line` … `last line||`) becomes `` — used - * for thinking blocks so they stay collapsed and distinct from tool-call - * quotes (Telegram has no per-message quote color). - */ -const EXPANDABLE_OPEN = '**>' - +/** Convert `> …` line groups into `` (Telegram renders it with the accent-colored left bar). */ function blocksToHtml(text: string): string { const lines = text.split('\n') const out: string[] = [] let quote: string[] = [] - let expandable = false const flush = (): void => { if (quote.length === 0) return - const open = expandable ? '' : '' - out.push(`${open}${inlineToHtml(quote.join('\n'))}`) + out.push(`${inlineToHtml(quote.join('\n'))}`) quote = [] - expandable = false } for (const line of lines) { - if (line.startsWith(EXPANDABLE_OPEN)) { - flush() - expandable = true - let content = line.slice(EXPANDABLE_OPEN.length) - if (content.endsWith('||')) { - quote.push(content.slice(0, -2)) - flush() - } else { - quote.push(content) - } - } else if (line.startsWith('> ')) { - let content = line.slice(2) - let closed = false - if (expandable && content.endsWith('||')) { - content = content.slice(0, -2) - closed = true - } - quote.push(content) - if (closed) flush() - } else if (line === '>') { - quote.push('') - } else { + if (line.startsWith('> ')) quote.push(line.slice(2)) + else if (line === '>') quote.push('') + else { flush() out.push(inlineToHtml(line)) }