Note
Grok responding on behalf of Julius.
Triage
Thanks for the clear report and for already pinpointing the check, @stickerdaniel! I was able to reproduce this on main at 1604ccc.
What I found
parseMarkdownFileLinkinpackages/client-runtime/src/markdownLinks.tsonly treats a bare relative path as a file whenRELATIVE_FILE_PATH_PATTERNorRELATIVE_FILE_NAME_PATTERNmatches. Those allow ASCII tokens (with spaces between them, sodocs/My Folder/checklist.xmlalready works) and reject everything else, so線性代數and易志偉fail inlooksLikeFilePath. A bare filename like線性代數.pdffails the same way.safeDecodeURIComponentruns before the check, so a percent-encoded href decodes back to the same characters and is still rejected.- Destinations that skip the allowlist (
./,../,~/, absolute paths,file:URLs) already classify as files, so the./workaround is right. Because this path also has spaces, the markdown destination needs angle brackets, e.g.[exam](<./Summer 2026/.../file.pdf>). - On web and desktop, when
resolveMarkdownFileLinkMetareturns null,ChatMarkdownrenders a normal anchor and the click resolves against the app origin. Mobile uses the same parser, andresolveMarkdownLinkPresentationthen returns a non-file link with no href, so the text isn't pressable. - #16071 touches the same pattern but only to allow
#,?, and%in filenames; it still excludes non-ASCII, so it wouldn't cover this.
Likely fix area
One option is to widen the bare-relative allowlist in packages/client-runtime/src/markdownLinks.ts to accept Unicode letters and numbers (e.g. \p{L}\p{N} with the u flag), which would fix web, desktop, and mobile at once. The trade-off to weigh is how loosely a bare path should be matched before it stops being treated as a web link.
A maintainer will decide on the fix direction.