Repository navigation
fix(shared): relative Windows file links open the file - #33643
Conversation
…lving Relative Markdown file links written with Windows separators (src\Example.cs, its %5C-encoded form, .\src\Example.cs, and with a :line suffix) resolve to null, so they render as plain browser links instead of file chips, while the forward-slash form resolves to the workspace file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Markdown links such as [x](src\Example.cs) reach the parser as src%5CExample.cs, and the relative-path grammar only knew `/`, so they rendered as plain links that opened a browser tab. Decoded relative destinations now take `/` separators before classification, matching inline code. Rooted paths (`\\host`, `\foo`, `/\host`, drive paths) are left as authored so the network-path guard sees them unchanged. A leading `./` is dropped before joining with the workspace so `.\src\x` resolves to the same target as `src\x`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
POSIX file names may contain a backslash, so only links that do not parse as written fall back to treating it as a separator. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — Relative Windows-style Markdown links now use existing file-link handling rather than ordinary link navigation. Previously recognized paths and rooted-path safeguards remain unchanged, keeping the change narrowly scoped. No code changes detected at You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 9e12eca)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit 9e12eca)
**v0.1.9** · 198 changes from 31 contributors - **T3 Connect agent sign-in.** Approve agent sign-ins with T3 Connect instead of copying a pairing code. - **Send during uploads.** Send messages with attachments while they are still uploading. - **Claude session approvals.** Allow an MCP app for a Claude session instead of approving each action individually. - **Screen reader announcements.** Hear agent messages and steps during a turn without leaving the composer. - **GitLab revert.** Revert a merged GitLab merge request from T3 Code. - **OpenCode goals.** Use OpenCode's native goals and keep their state in sync across clients. - **Pull request links.** Open pull request links directly to their referenced comment, diff line, checks, or commit. ### Plus 164 more bug fixes and performance improvements. <details> <summary>Full changelog</summary> ## What's Changed * fix(web): checking for updates finds provider updates on every machine by @t3dotgg in pingdotgg/t3code#33538 * fix(web): settings say custom instructions cover pull request descriptions by @maria-rcks in pingdotgg/t3code#33113 * feat(web): send messages while attachments upload by @maria-rcks in pingdotgg/t3code#33092 * fix(mobile): Android PDF preview double-tap zoom and easier link taps by @juliusmarminge in pingdotgg/t3code#33570 * feat: approve agent sign-ins with T3 Connect instead of a code by @juliusmarminge in pingdotgg/t3code#33600 * fix(mobile): the composer and search bars move with their iOS columns by @juliusmarminge in pingdotgg/t3code#33543 * ci(mobile): build Android store releases on Blacksmith by @juliusmarminge in pingdotgg/t3code#33565 * fix(web): thread title menu opens without a half-second wait on desktop by @t3dotgg in pingdotgg/t3code#33598 * fix(web): a new side chat focuses its message input by @darioielardi in pingdotgg/t3code#32929 * perf(opencode): bound usage reads to in-window messages by @Yash-Singh1 in pingdotgg/t3code#33612 * chore(web): upgrade @pierre/diffs to 1.7 and use its built-in find by @juliusmarminge in pingdotgg/t3code#33627 * fix(web): expanding hidden diff context works after a diff refresh by @juliusmarminge in pingdotgg/t3code#33629 * feat: approve agent sign-ins on app.t3.codes with T3 Connect by @juliusmarminge in pingdotgg/t3code#33632 * perf(cursor): improve account usage scanning by @Yash-Singh1 in pingdotgg/t3code#33636 * fix(web): dropdown items over the desktop title bar respond to clicks by @screen-gd in pingdotgg/t3code#32643 * fix: hosted agent approval no longer fails with "Your session cannot approve" by @juliusmarminge in pingdotgg/t3code#33645 * fix(web): new threads use the last used project by @Yash-Singh1 in pingdotgg/t3code#33626 * fix(mobile): distinguish local ACP instances by name by @shivamhwp in pingdotgg/t3code#32467 * ci(mobile): dev clients build on Blacksmith, and mobile:install starts that build by @juliusmarminge in pingdotgg/t3code#33617 * fix(mobile): Android sidebar and composer transitions no longer reflow at rest by @juliusmarminge in pingdotgg/t3code#33599 * fix(server): price Antigravity Gemini Flash effort variants by @Ephraim-9 in pingdotgg/t3code#13809 * fix(mobile): Android feed stays at its end after the keyboard or sidebar changes by @juliusmarminge in pingdotgg/t3code#33611 * fix(server): Antigravity install no longer fails on a stale Windows Crashpad pipe by @juliusmarminge in pingdotgg/t3code#26374 * ci(mobile): Android PR preview clients build on Blacksmith by @juliusmarminge in pingdotgg/t3code#33618 * fix(web): scrolling pans expanded images and Mermaid diagrams by @shivamhwp in pingdotgg/t3code#26630 * fix(desktop): agents see visible:true while the desktop shows their tab by @shivamhwp in pingdotgg/t3code#23589 * fix(server): allow requested WebMCP writes by @shivamhwp in pingdotgg/t3code#26570 * fix(antigravity): resolve model names from usage metadata by @Yash-Singh1 in pingdotgg/t3code#33661 * fix(web): show details for background commands by @Yash-Singh1 in pingdotgg/t3code#33647 * fix(ci): store-build checkouts drop credentials without submodule cleanup by @juliusmarminge in pingdotgg/t3code#33664 * fix(web): "Use T3 Code in another app" opens the Grok Bot app by @juliusmarminge in pingdotgg/t3code#33663 * ci(mobile): keep the Android store AAB as a workflow artifact by @juliusmarminge in pingdotgg/t3code#33674 * fix(mobile): hide compose in the detail rail while starting a task by @juliusmarminge in pingdotgg/t3code#33678 * ci(mobile): version bump commits no longer credit Codex by @juliusmarminge in pingdotgg/t3code#33689 * fix(server): stop PR watch flapping while workflows await approval by @shivamhwp in pingdotgg/t3code#24599 * fix(server): show idle paragraphs before the assistant turn ends by @shivamhwp in pingdotgg/t3code#28221 * fix(mobile): fit usage view selector beside the date range at large text by @PixPMusic in pingdotgg/t3code#33682 * fix(web): center short PR titles in thread details by @Yash-Singh1 in pingdotgg/t3code#33724 * fix(server): Claude threads can allow an MCP app for the session by @t3dotgg in pingdotgg/t3code#33707 * fix(web): reclaim notice says the machine will be offline by @shivamhwp in pingdotgg/t3code#33730 * fix(server): detaching a session no longer strands its pending approval by @juliusmarminge in pingdotgg/t3code#33535 * fix(opencode): long command turns no longer fail when the command request times out by @juliusmarminge in pingdotgg/t3code#27677 * fix(server): a queued message that names no model keeps the model picked ahead of it by @juliusmarminge in pingdotgg/t3code#33591 * fix(ssh): tunnel readiness no longer counts ssh's connection time by @juliusmarminge in pingdotgg/t3code#33554 * fix(server): preview_evaluate accepts top-level await by @juliusmarminge in pingdotgg/t3code#31925 * fix(server): quitting no longer restarts the relay client mid-shutdown by @juliusmarminge in pingdotgg/t3code#33628 * fix(shared): relative Windows file links open the file by @juliusmarminge in pingdotgg/t3code#33643 * fix(server): a steer that restarts a completion wake no longer strands later subagent results by @juliusmarminge in pingdotgg/t3code#33469 * fix(server): provider status checks no longer make mise download missing CLIs by @juliusmarminge in pingdotgg/t3code#33448 * fix(forgejo): find merged pull requests whose head branch was deleted by @juliusmarminge in pingdotgg/t3code#33675 * perf(shared): speed up escaped Markdown in long PR descriptions by @AksharP5 in pingdotgg/t3code#33438 * fix(server): a background agent tab survives a desktop window reload by @juliusmarminge in pingdotgg/t3code#33666 * fix(server): Commit, push & PR no longer pushes the default branch into itself by @juliusmarminge in pingdotgg/t3code#33695 * fix(acp): OMP threads show html_render pages by @juliusmarminge in pingdotgg/t3code#33677 * fix(ssh): Intel Mac hosts no longer try to download a missing t3 archive by @juliusmarminge in pingdotgg/t3code#33325 * fix(server): opening the branch menu no longer wipes PR status by @juliusmarminge in pingdotgg/t3code#33263 * fix(server): failed updates report download diagnostics by @tanav29 in pingdotgg/t3code#33239 * fix(web): remote Lineage rows keep their title when the environment name is long by @f4llenz in pingdotgg/t3code#33181 * fix(web): custom snooze footer stays inside the dialog by @juliusmarminge in pingdotgg/t3code#33759 * fix(desktop): right-clicking a mailto link offers Copy Email Address by @juliusmarminge in pingdotgg/t3code#33262 * fix(acp-registry): commands past the 128th are no longer dropped by @juliusmarminge in pingdotgg/t3code#33768 * fix(server): one finished turn looks up its branch's pull request once by @juliusmarminge in pingdotgg/t3code#33752 * fix(mobile): Android Files sheet scrolls its tree instead of dragging the sheet by @RadekManak in pingdotgg/t3code#33223 * fix(web): prompt suggestions show after a steered turn by @thelogicmatrix in pingdotgg/t3code#33706 * fix(server): usage prices Claude Mythos 5.2 from its Bedrock rate by @juliusmarminge in pingdotgg/t3code#33721 * fix(server): Claude turns whose CLI exits before its first frame fail instead of running forever by @juliusmarminge in pingdotgg/t3code#33008 * fix(web): panel resize handles follow touch drags by @juliusmarminge in pingdotgg/t3code#33066 * fix(server): signed-out Claude instances with their own config dir name it in the sign-in hint by @juliusmarminge in pingdotgg/t3code#32951 * perf(server): opening a long thread reads from its latest segments, not its whole history by @t3dotgg in pingdotgg/t3code#33305 * fix(server): repos without a remote no longer record failed spans on status refresh by @ferhtgoldaraz in pingdotgg/t3code#32905 * fix(mobile): missing files in previews name the checked path instead of asking to reconnect by @juliusmarminge in pingdotgg/t3code#32994 * fix(server): a restart that misses its turn starts as a new turn by @juliusmarminge in pingdotgg/t3code#32899 * fix(desktop): new browser tabs no longer lose waits, clicks and snapshots for good by @juliusmarminge in pingdotgg/t3code#32861 * fix(web): Go to source on a side chat quote keeps you on its parent thread by @juliusmarminge in pingdotgg/t3code#33160 * fix(server): removing a queued completion message keeps its siblings' wakes by @juliusmarminge in pingdotgg/t3code#32815 * fix(server): dev database seed drops active pull request watches by @juliusmarminge in pingdotgg/t3code#32744 * fix(server): capture iOS screenshots on Xcode 26's simctl by @shivamhwp in pingdotgg/t3code#28353 * fix(mobile): medium Android windows keep the rail's room and the sidebar's place by @dongxingong in pingdotgg/t3code#33021 * fix(web): notify when a new request replaces the pending one in a run by @juliusmarminge in pingdotgg/t3code#32719 * fix(server): Codex first-request usage limits keep their reset time by @shivamhwp in pingdotgg/t3code#27791 * fix(web): minimap next turn is disabled at the bottom of a thread by @juliusmarminge in pingdotgg/t3code#33038 * fix(cursor): a steer keeps the prompt it interrupted by @juliusmarminge in pingdotgg/t3code#32583 * test: remove redundant short-string truncation test by @t3-code-bot[bot] in pingdotgg/t3code#33867 * fix(pi): Pi models whose provider ID contains a slash can be selected by @juliusmarminge in pingdotgg/t3code#32585 * perf(server): MCP tool calls no longer read the caller's whole thread by @t3dotgg in pingdotgg/t3code#33295 * fix(ssh): concurrent launches on one remote home share one server by @juliusmarminge in pingdotgg/t3code#32587 * fix(mobile): iOS 18 iPad sidebar and thread feed start below the header by @juliusmarminge in pingdotgg/t3code#32936 * fix(web): Tab reaches the add-project and new-project submit buttons by @juliusmarminge in pingdotgg/t3code#32605 * fix(web): screen readers hear the add-project submit shortcut by @juliusmarminge in pingdotgg/t3code#32576 * fix(server): Antigravity limits read the quota host the account is metered on by @juliusmarminge in pingdotgg/t3code#32425 * fix(web): the thread menu works for an older settled thread the sidebar hasn't loaded by @juliusmarminge in pingdotgg/t3code#32507 * fix(opencode): show questions asked while OpenCode wakes a session on its own by @juliusmarminge in pingdotgg/t3code#32434 * fix(server): blank .gitignore lines no longer make checkpoints drop new files by @juliusmarminge in pingdotgg/t3code#32374 * test(web): minimap next-turn test no longer flakes after a resize by @t3dotgg in pingdotgg/t3code#33964 * feat(opencode): mirror native goals across clients by @Yash-Singh1 in pingdotgg/t3code#33758 * feat(web): bindable shortcut to regenerate a thread's title by @sharanry in pingdotgg/t3code#33987 * fix(server): linked projects keep their repository identity while it refreshes by @juliusmarminge in pingdotgg/t3code#32359 * fix(mobile): tool call commands are highlighted and monospaced like on web by @juliusmarminge in pingdotgg/t3code#33957 * fix: Claude monitor wakes no longer fire a completion alert per line by @juliusmarminge in pingdotgg/t3code#32520 * fix(server): removed thread worktrees keep their project's skills in the picker by @juliusmarminge in pingdotgg/t3code#32471 * fix(web): drag command palette threads into the composer by @Yash-Singh1 in pingdotgg/t3code#33990 * fix(shared): show zero seconds in minute durations by @Yash-Singh1 in pingdotgg/t3code#33994 * fix(web): closing the right panel returns focus to where it was by @juliusmarminge in pingdotgg/t3code#32569 * fix(server): say why threads without a project are unavailable by @juliusmarminge in pingdotgg/t3code#32342 * fix: chat file links open the file agents cite by @juliusmarminge in pingdotgg/t3code#33943 * fix(clients): scroll truncated command output notice with logs by @Yash-Singh1 in pingdotgg/t3code#34011 * fix(web): show app bundle icons and open apps from markdown links by @Yash-Singh1 in pingdotgg/t3code#33950 * feat(opencode): project native todo updates into checklists by @Yash-Singh1 in pingdotgg/t3code#34000 * fix(antigravity): recognize Gemini 4 Carbon and its quota by @DrSeedon in pingdotgg/t3code#33991 * perf(client): reopening a finished command row no longer refetches its output by @juliusmarminge in pingdotgg/t3code#34002 * perf(server): user-only message reads use the user-message index for ordinals by @juliusmarminge in pingdotgg/t3code#33009 * fix(web): keep HTML previews anchored when accordions expand by @Yash-Singh1 in pingdotgg/t3code#34003 * fix(web): preserve search result titles in drag previews by @Yash-Singh1 in pingdotgg/t3code#34017 * fix: file links with line ranges open at their first line by @juliusmarminge in pingdotgg/t3code#34006 * fix(codex): show image generation tool calls by @Yash-Singh1 in pingdotgg/t3code#34020 * fix(pi): a steer Pi has not read yet shows as waiting, not steered by @juliusmarminge in pingdotgg/t3code#33982 * fix(server): provider switches hand off started cancelled runs by @juliusmarminge in pingdotgg/t3code#34016 * fix(web,mobile): replace sparkles icons and ban them with a lint rule by @flamboh in pingdotgg/t3code#25422 * fix(github): a proxy's 403 with Retry-After is no longer reported as a rate limit by @juliusmarminge in pingdotgg/t3code#33676 * fix(web): sending from an empty citation comment clears the composer by @juliusmarminge in pingdotgg/t3code#33440 * fix(server): text generation fallback respects project provider settings by @Muzammil-Bit in pingdotgg/t3code#33741 * feat(usage): show Muse Code limits, and xAI and Antigravity accounts from a CLIProxyAPI hub by @StiensWout in pingdotgg/t3code#33800 * fix(web): preserve previews during attachment preparation by @Yash-Singh1 in pingdotgg/t3code#33949 * fix(desktop): input during window teardown no longer throws in the main process by @juliusmarminge in pingdotgg/t3code#33620 * fix(web): sent messages keep the numbers written on list items by @tsapa44 in pingdotgg/t3code#33820 * fix(server): quitting stops an agent-device daemon left by an earlier server by @juliusmarminge in pingdotgg/t3code#33587 * fix(mobile): attaching larger images no longer crashes with a BigInt error by @juliusmarminge in pingdotgg/t3code#34087 * feat(mobile): pick a voice environment once, then its method by @juliusmarminge in pingdotgg/t3code#34073 * fix(server): a t3 thread send to a finished delegated child notifies its parent by @juliusmarminge in pingdotgg/t3code#33446 * fix(web): question panel header text sits centered in its row by @juliusmarminge in pingdotgg/t3code#34095 * feat(scripts): scenarios prove a fix in the real app with e2e, on web and iOS by @juliusmarminge in pingdotgg/t3code#34007 * feat(claude): Fable resets are offered and redeemed apart from weekly resets by @juliusmarminge in pingdotgg/t3code#34106 * fix(desktop): desktop IPC only answers the main app window by @juliusmarminge in pingdotgg/t3code#34094 * feat(server): voice models reuse copies already on disk by @juliusmarminge in pingdotgg/t3code#34096 * fix(web): scroll project picker to top on first result by @Yash-Singh1 in pingdotgg/t3code#34113 * feat(opencode): track native image job outcomes and previews by @Yash-Singh1 in pingdotgg/t3code#34089 * fix(scripts): scenarios run where localhost resolves to IPv6 first by @juliusmarminge in pingdotgg/t3code#34121 * ci: browser secret helper apt step fetches fewer indexes by @t3dotgg in pingdotgg/t3code#33966 * fix(client-runtime): a search query pasted from github.com lists pull requests again by @juliusmarminge in pingdotgg/t3code#30150 * fix(web): tighter outdated-conversation cards in the PR code panel by @Yash-Singh1 in pingdotgg/t3code#34140 * fix(web): MCP App cards no longer flash white in dark mode while the app loads by @juliusmarminge in pingdotgg/t3code#33352 * fix(peer): link requests use the addresses the app already has for a machine by @t3dotgg in pingdotgg/t3code#34139 * fix(server): Find frees searched thread text after one idle minute by @t3dotgg in pingdotgg/t3code#34132 * fix(web): settings search shortcuts follow the physical key on non-US layouts by @juliusmarminge in pingdotgg/t3code#33395 * fix(server): import Codex chats moved into a project from the scratch folder by @juliusmarminge in pingdotgg/t3code#32880 * fix(desktop): clear stale GPU caches when the Electron version changes by @juliusmarminge in pingdotgg/t3code#33641 * fix(web): PR links jump to the comment, diff line, checks or commits they name by @Yash-Singh1 in pingdotgg/t3code#33989 * fix(cli): installers retry transient GitHub errors by @juliusmarminge in pingdotgg/t3code#32913 * fix(web): opening the terminal with Cmd+J no longer re-renders the whole sidebar by @juliusmarminge in pingdotgg/t3code#33129 * refactor(web): remove icon morphing by @maria-rcks in pingdotgg/t3code#33985 * feat(opencode): track native shell jobs across turns by @Yash-Singh1 in pingdotgg/t3code#34141 * fix(server): restart send stops a Claude turn and runs the message next by @juliusmarminge in pingdotgg/t3code#32902 * fix(shared): login-shell environment probe ignores DEBUG trap output by @juliusmarminge in pingdotgg/t3code#32646 * fix(web): make Q&A option outlines visible across themes by @Yash-Singh1 in pingdotgg/t3code#34178 * fix(web): hide empty replies when renders show the result by @Yash-Singh1 in pingdotgg/t3code#34182 * fix(web): mouse tilt wheel no longer switches threads on Windows and Linux desktop by @juliusmarminge in pingdotgg/t3code#32963 * fix(web): timeline minimap preview no longer steals hover or jumps around by @NoomStuff in pingdotgg/t3code#32151 * fix(server): auto thread sends queue while a turn is stopping by @tanav29 in pingdotgg/t3code#34163 * fix(server): stream the usage-scan cache to disk instead of one string by @juliusmarminge in pingdotgg/t3code#34030 * fix(clients): images the agent opens stay visible in the chat by @fedeinfe in pingdotgg/t3code#30473 * fix(client-runtime): pasted repository page URLs clone the repository into its own folder by @juliusmarminge in pingdotgg/t3code#32681 * fix(web): trackpad flicks over the right panel tabs no longer navigate back by @juliusmarminge in pingdotgg/t3code#33396 * fix: new threads move from draft to Working in one step by @juliusmarminge in pingdotgg/t3code#33783 * fix(gitlab): review comments can cover a range of lines by @TonybynMp4 in pingdotgg/t3code#30535 * test(web): right panel tab swipe test runs as macOS on any CI host by @juliusmarminge in pingdotgg/t3code#34191 * fix(shared): cite assistant messages with IDs over 512 characters by @juliusmarminge in pingdotgg/t3code#28084 * fix(server): updates copy the database while the server still runs when it cannot be cloned by @binjamshid in pingdotgg/t3code#33058 * fix(mobile): file links in question cards open the file viewer by @juliusmarminge in pingdotgg/t3code#29151 * fix(server): cloning into a stranded clone project's empty folder reuses that project by @juliusmarminge in pingdotgg/t3code#33439 * fix(desktop): stable updates no longer show a nightly's release notes by @juliusmarminge in pingdotgg/t3code#32832 * fix(shared): Open in Zed ignores the OpenZFS zed daemon on Linux by @juliusmarminge in pingdotgg/t3code#33479 * fix(mobile): chat code blocks colour diff, kotlin, sql and other languages again by @juliusmarminge in pingdotgg/t3code#33680 * fix(server): fork Claude threads after project root changes by @juliusmarminge in pingdotgg/t3code#22836 * fix(web): snooze times read naturally in context menus by @TonybynMp4 in pingdotgg/t3code#24945 * feat(web): label chips show the label's description on hover by @TonybynMp4 in pingdotgg/t3code#28732 * feat(web): composer strip names the worktree folder by @TonybynMp4 in pingdotgg/t3code#28459 * feat(gitlab): revert a merged merge request by @TonybynMp4 in pingdotgg/t3code#30556 * fix(claude): version errors from a custom endpoint no longer say to run claude update by @binjamshid in pingdotgg/t3code#34176 * fix(web): files marked Viewed stay folded when a pull request's Code tab opens again by @Umais-Adeed in pingdotgg/t3code#34168 * feat(server): watched GitHub pull requests react to host events, not only the 2-minute sweep by @juliusmarminge in pingdotgg/t3code#33548 * fix(server): hide passive Claude Stop-hook summaries by @juliusmarminge in pingdotgg/t3code#22964 * fix(web): dismiss image path tooltips after preview and scroll by @voltcrash in pingdotgg/t3code#30620 * fix(server): PR sync and run-status checks stop reading whole thread histories by @juliusmarminge in pingdotgg/t3code#25728 * fix(server): preview snapshots keep page text beside large accessibility trees by @juliusmarminge in pingdotgg/t3code#33745 * feat(web): screen readers can hear the agent's messages and steps during a turn by @shivamhwp in pingdotgg/t3code#33900 * fix(server): thread search finds phrases inside quotes and their comments by @only21mil in pingdotgg/t3code#22553 * fix(web): local server cards in the browser empty state take pointer clicks by @juliusmarminge in pingdotgg/t3code#34050 * fix(server): worktrees cut from a non-default base no longer show the base's PR by @t3dotgg in pingdotgg/t3code#22861 * fix(desktop): wait for the local server to exit when quitting by @juliusmarminge in pingdotgg/t3code#22996 * fix(server): agent continuations preserve the working timer start by @juliusmarminge in pingdotgg/t3code#22947 * fix(web): disable the git actions menu when nothing in it is usable by @Serendeep in pingdotgg/t3code#31972 * fix(server): preserve active turns when switching provider instances by @juliusmarminge in pingdotgg/t3code#22755 * fix(server): scheduled task updates keep the saved workspace unless the binding changes by @juliusmarminge in pingdotgg/t3code#32494 * fix(web): full-screen HTML pages fit their content and zoom by reflowing by @Zeus-Deus in pingdotgg/t3code#22349 * fix(web): project actions auto-open Preview in web clients by @juliusmarminge in pingdotgg/t3code#34048 * fix(server): a follow-up delegated task waits for a run its child queued on its own thread by @juliusmarminge in pingdotgg/t3code#32504 ## New Contributors * @darioielardi made their first contribution in pingdotgg/t3code#32929 * @tanav29 made their first contribution in pingdotgg/t3code#33239 * @RadekManak made their first contribution in pingdotgg/t3code#33223 * @thelogicmatrix made their first contribution in pingdotgg/t3code#33706 * @ferhtgoldaraz made their first contribution in pingdotgg/t3code#32905 * @dongxingong made their first contribution in pingdotgg/t3code#33021 * @sharanry made their first contribution in pingdotgg/t3code#33987 * @tsapa44 made their first contribution in pingdotgg/t3code#33820 * @NoomStuff made their first contribution in pingdotgg/t3code#32151 * @fedeinfe made their first contribution in pingdotgg/t3code#30473 **Full Changelog**: pingdotgg/t3code@v0.1.8...v0.1.9 </details> Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.9
Problem
A relative Markdown file link written with Windows separators, such as
[Windows path](src\Example.cs), renders as a plain link. Clicking it opens a browser tab at/<environment>/src%5CExample.csinstead of the file. The same link written as[Slash path](src/Example.cs)renders as a file chip and opens the file viewer. To reproduce on main: open a project that containssrc/Example.cs, then have a message contain both links. It happens in agent replies and in user messages, on any host.Change
parseMarkdownFileLinkinpackages/sharedfirst parses the destination exactly as main does. If that fails, and the path is relative and contains a backslash, it parses again with\read as/.src\Example.cs,src%5CExample.csandsrc\Example.cs:3then resolve to the same target as their slash forms. Inline code paths already read relative\as a separator.Links that already resolved keep their spelling. POSIX file names may contain a backslash, so
./foo%5Cbar.tsstill opensfoo\bar.ts. Rooted paths (\foo,\\host\share) and Windows drive paths are never rewritten, so the network-path guard sees them unchanged. Web and mobile both call this parser, so both get the fix.Scope and approval
Fixes #33625
Verification
Focused tests:
packages/shared/src/markdownLinks.test.tsresolves the relative link %s against a windows cwd: three cases (src\Example.cs,src%5CExample.cs,src\Example.cs:3) fail on main withexpected null to be 'C:\repo\src\Example.cs'and pass with the fix.keeps a backslash in a relative link that already names a file: guards the POSIX literal-backslash case.\foo.tsis still not a file link, and/\server\share\x.tskeeps its spelling.vp test runpassed onmarkdownLinks,fileLinks,threadFindText, webmarkdown-linksand mobilemarkdownLinks: 108 tests.markdownLinks.tsand its web and mobile callers are unchanged since the captures at 7cbf20e.vp run check:changedpassed on 545a290 (format, lint, knip, typecheck, 64 tests).Real app: web dev server on a fresh database, project with
src/Example.cs, and one thread whose user message and agent reply both contain the two links.File-name label and non-media embed, in one user message:
W2: [Example.cs](src\Example.cs) W8:  control: [Example.cs](src/Example.cs). Before is on main 53bcb9a, the current merge-base; after is on 7cbf20e.What else changed, visible in the captures:
\that fail the first parse now render as file chips and open the file viewer. This applies to the link label, the file-name label and a non-media embed (which showed "Image unavailable" before).Notes on the evidence:
Example.cschips in both messages, and the file viewer showssrc/Example.cswith its contents. These stills show how each link is classified and the end state; they are not a recording of the clicks.Not checked:
C:\repounit cases, and the fixed link takes the same path as the slash link.). They still resolve throughmarkdownDestinationHostPathand keep their backslashes. A non-media embed now gets the existing file-chip fallback (captured above).AI-assisted; verified with the tests and tools listed above.