[Bug]: Sent prompts strike through text between two single tildes that the rich composer showed literally
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 72/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- react, typescript
- Ambito
- frontend
Direzione di ricerca
Inizia da apps/web/src/components/ChatMarkdown.tsx e dalla chiamata a ChatMarkdown in apps/web/src/components/chat/MessagesTimeline.tsx; confronta i plugin remark della timeline con il comportamento di una singola tilde in apps/web/src/composer-rich-text.ts. Il controllo di ripristino dell’issue definisce il criterio di completamento: le singole tilde rimangono visibili senza barratura nei messaggi inviati dagli utenti, mentre ~~struck~~ continua a essere visualizzato barrato.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/web
Steps to reproduce
Summary
With the rich text composer on (the default), a prompt containing two single ~ characters in one paragraph, for example two home-relative paths such as ~/folder-a/... and (~/folder-a/...), shows both tildes as literal text while composing. After sending, the user message in the chat timeline renders everything between them with strikethrough and drops both tildes. The rich composer's markdown dialect and the timeline's markdown dialect disagree on single tildes, so the sent message misrepresents what the user typed. The stored message text and the text the provider receives are unchanged; only the rendering is affected.
Steps
- On the build listed under Runtime or environment, with the rich text composer enabled (default), open any thread.
- Type this prompt exactly, without backticks:
Install the skill as ~/folder-a/skills/x, then follow the guide (~/folder-a/guide.md). - Observe the composer: both tildes are plain text, nothing is styled.
- Send the prompt and look at the user message in the timeline.
Steps 1–4 with this exact string were not run in the app by the investigator; the in-app symptom comes from the reporter's screenshot of a real prompt with the same shape (see Actual behavior). The renderer and composer behavior were reproduced headlessly with the parser versions apps/web locks ([email protected], [email protected], [email protected], [email protected]), using the remark plugins that apply to sent user messages (which render with parseRawHtml={false}, so no rehype plugins run):
import React from "react";
import { renderToStaticMarkup } from "react-dom/server";
import Markdown from "react-markdown";
import remarkGfm from "remark-gfm";
import remarkBreaks from "remark-breaks";
const text = "Install the skill as ~/folder-a/skills/x, then follow the guide (~/folder-a/guide.md).";
console.log(renderToStaticMarkup(React.createElement(Markdown, {
remarkPlugins: [remarkGfm, remarkBreaks],
}, text)));
Expected behavior
In rich text mode, the sent user message shows the tildes the composer showed: Install the skill as ~/folder-a/skills/x, then follow the guide (~/folder-a/guide.md). with both tildes visible and no strikethrough. The rich composer's inline-markdown parser (apps/web/src/composer-rich-text.ts) defines strikethrough as ~~ only and keeps a single ~ as literal text, stating that unmatched markers stay literal "so nothing the user typed is ever lost". That parser's guarantee is explicitly about the composer itself; applying it to the timeline rests on the inference that rich mode previews how the sent markdown will be formatted, since no code or test states that the composer and the timeline must render identically. Double-tilde strikethrough (~~struck~~) typed in the composer should keep rendering as strikethrough in the timeline. Plain-text composer mode, where every marker is shown literally by design, is out of scope.
Actual behavior
Supplied by the reporter: in T3 Code Nightly, a sent prompt containing ... as ~/[REDACTED]/gdp-ts, manifest-tracked, ... repo skill (~/[REDACTED]/SKILL.md) ... rendered in the timeline with roughly three lines, from just after the first tilde to just before the second, struck through and both tilde characters missing. By inference from that screenshot and the headless render below, the sample string in Steps to reproduce would render with /folder-a/skills/x, then follow the guide ( struck through and both tildes missing.
Headless run of the snippet above (local, locked versions) printed:
<p>Install the skill as <del>/folder-a/skills/x, then follow the guide (</del>/folder-a/guide.md).</p>
The composer's parser, run locally from main on the same string, returns a single unstyled span:
[{"text":"Install the skill as ~/folder-a/skills/x, then follow the guide (~/folder-a/guide.md).","marks":[]}]
Controls from the same local run: this is ~~struck~~ text renders <del>struck</del> in both the composer parser and the timeline renderer; files in ~/foo and ~/bar does not strike on web because the second tilde follows a space and cannot close; with remark-gfm configured as [remarkGfm, { singleTilde: false }] the report string renders literally while ~~struck~~ still renders <del>.
Evidence
- Expected source:
apps/web/src/composer-rich-text.tsonmain(header comment "Unmatched markers stay literal text so nothing the user typed is ever lost",RICH_TEXT_DELIMITERS.strike = "~~", and line 103 where a~run shorter than 2 cannot open a strike); rich mode is the default percomposerRichTextEnabledinpackages/contracts/src/settings.ts. - Failure source: reporter's desktop-app screenshot of the sent user message, plus the local headless render above; the user message path is
UserMessageBody→ChatMarkdowninapps/web/src/components/chat/MessagesTimeline.tsx(around line 4413), andChatMarkdownpasses bareremarkGfminCHAT_MARKDOWN_REMARK_PLUGINSandCHAT_MARKDOWN_REMARK_PLUGINS_WITH_BREAKS(apps/web/src/components/ChatMarkdown.tsxlines 495–506), whose strikethrough extension defaults tosingleTilde: true. - Evidence provenance: observed
- Local verification: reproduced
- Reproduction completeness: complete
The observed primary evidence is the local headless render with the locked parser versions and the local run of the composer parser; the in-app rendering is supplied by the reporter's screenshot. Local reproduction covers the third-party remark plugins on the user-message path (remark-gfm, remark-breaks; UserMessageBody passes parseRawHtml={false}, so ChatMarkdown applies no rehype plugins); T3 Code's own remark plugins in ChatMarkdown and the app itself were not exercised locally, so the in-app symptom rests on the supplied screenshot.
Note: GitHub's own Markdown API (POST /markdown, mode=gfm) also strikes single-tilde pairs for this string, so the expected behavior here rests on T3 Code's own rich composer dialect, not on GitHub rendering parity.
Restoration check
Failing: in rich text mode, sending Install the skill as ~/folder-a/skills/x, then follow the guide (~/folder-a/guide.md). produces a user message in the timeline with a struck-through span and missing tildes. Passing: the same sent message renders both tildes literally with no strikethrough, matching the composer. Controls: a prompt containing ~~struck~~ still renders strikethrough in both the composer and the sent message, so strikethrough is not simply disabled; and the stored and provider-bound prompt text stays byte-identical to what was typed (no escaping or rewriting of ~ on send).
Additional context
Open PR pingdotgg/t3code#9021 ("fix(web,mobile): match GitHub strikethrough parsing") changes ChatMarkdown to { singleTilde: false } and patches the mobile renderer; it has no linked issue. Its stated premise that github.com only strikes double tildes did not hold for the Markdown API check above, but its web change would satisfy this report's restoration check. That PR also reports the mobile renderer striking single-tilde pairs more often (for example files in ~/foo and ~/bar); mobile was not investigated here and this report is limited to the web/desktop timeline. Whether assistant messages should also stop striking single tildes is a separate product choice; this report covers text the user typed in the rich composer.
Triage assessment
- Impact level: P3
- Assessment status: supported
- Impact basis: Only the rendered timeline view is wrong (struck span, hidden tildes); the stored prompt, the copy-message text and the text sent to the provider keep the original characters, so no data or workflow result is lost, though the sent message misrepresents what the user typed.
- Workaround status: available
- Workaround basis: Wrapping paths in backticks (
`~/folder-a/guide.md`) renders them as inline code with tildes intact in the locally run renderer; it adds code-span markers to the sent text, and the path characters themselves are unchanged.
Impact
Cosmetic issue
Version or commit
T3 Code (Nightly) 0.0.46-nightly.20261005.2676; source inspected at main @ e22c8804346d4bd45a733803eda826e04e3bbd74
Environment
macOS 27.0, T3 Code (Nightly) desktop app, Claude provider
Logs or stack traces
No response
Screenshots, recordings, or supporting files
No response
Workaround
Wrapping paths in backticks (`~/folder-a/guide.md`) renders them as inline code with tildes intact in the locally run renderer; it adds code-span markers to the sent text, and the path characters themselves are unchanged.
- Lingua principale
- TypeScript
- Stelle
- 24.8k
- Fork
- 6.4k
- Merge medio
- 7h 14m
- PR unite (30g)
- 201
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di pingdotgg/t3code
-
bug via-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
pingdotgg/t3code#16096 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
bug via-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
pingdotgg/t3code#16090 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
bug via-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
pingdotgg/t3code#15954 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug]: IntelliJ IDEA not detected on macOS when the Toolbox app bundle has a version in its nameForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertabug via-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
pingdotgg/t3code#15933 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di pingdotgg/t3code
Issue simili
-
area:docs bug triage:confirmed
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
Cotal-AI/Cotal#2875 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
anomalyco/models.dev#8862 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
fix(data-lake): wizard source step still previews the local slug, not the server-disambiguated oneForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertadata-lake
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
ready-for-triage
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
konflux-ci/konflux-ui#1596 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement good first issue priority: low size: XS
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno