f525772725
* fix(desktop): keep config/structured code blocks fenced instead of unwrapping to prose The desktop markdown preprocessor has a "prose fence" heuristic that strips the fence off blocks it thinks are wrapped prose. Its `proseLines >= 3 && codeSignals === 0` rule fires on ANY 3+ line plaintext block with no JS/SQL tokens -- which is exactly what an SSH config, a .env dump, or any INI/key-value listing looks like. The result was that a fenced ```-block of SSH config rendered as a flat paragraph instead of a code block. Add isLikelyStructuredText() and use it as a veto in both isLikelyProseFence() and isLikelyProseCodeBlock(): a block is treated as structured (and kept fenced) when it has indented continuation lines, or when it has no sentence-ending punctuation and a majority of lines are `Key value` / `Key: value` directives. Real wrapped prose has sentence-shaped lines and no per-line indentation, so it still unwraps as before. The bullet-prose case in isLikelyProseCodeBlock is checked first so markdown bullet lists remain prose. Tests: markdown-code.test.ts gains SSH-config / flat-config / .env regression cases for both functions, plus direct isLikelyStructuredText coverage, and re-asserts that genuine paragraph prose still unwraps. * fix(desktop): tighten config-line detection to not match punctuation-less prose The first CONFIG_LINE_RE matched any 'word word' line, so a wrapped prose fragment with no sentence punctuation (e.g. 'the quick brown fox jumps') was misread as a config directive and its fence kept. Split into an explicit-separator form (Key: value / Key = value) plus a short 2-3 token 'Key value' directive form; a real sentence line has more tokens, so punctuation-less prose is no longer treated as config.