Repository navigation
fix(web): links in HTML renders open like chat links - #18897
Conversation
A pull request opens in the right panel, other links follow the Open links in setting, and Cmd/Ctrl-click goes to the system browser.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This changes the production default behavior for links inside HTML renders, routing pull requests to the right panel and other links through the configured link-target preference instead of always opening a browser tab. The implementation is localized, but the user-visible default change warrants deliberate review. 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. |
Dismissing prior approval to re-evaluate b3e3b1d
## What's Changed * fix(web): links in HTML renders open like chat links by @maria-rcks in pingdotgg/t3code#18897 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3053...v0.0.46-nightly.20261013.3066 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261013.3066
## What's Changed * fix(web): links in HTML renders open like chat links by @maria-rcks in pingdotgg/t3code#18897 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3053...v0.0.46-nightly.20261013.3066 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261013.3066
Sync 1013a: 52 upstream commits, clean in git. Fork types adapted: the orchestration handlers test stub forwards the new prepareRun (pingdotgg#19102), and the fork's HTML render panel card passes threadRef to its inline frame so links open like chat links (pingdotgg#18897). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merges `pingdotgg/t3code` up to `6002c5c68c` (42 commits, base `5070a83a32`), using a merge commit. No open merge PR to stack on; this branches from `main` at `882bb0a638`. ## Resolution - **`package.json`** (conflict): dropped upstream's `tsc-rs` 0.6.0 bump (pingdotgg#19187). The fork removed `tsc-rs`, and the `tsc-rs` tripwire holds that. New path-policy entry: `root-package-json` (`decide`). - **`pnpm-lock.yaml`** (conflict, `theirs`): took upstream's copy. Its seven `tsc-rs@0.6.0` entries fail `minimumReleaseAge` before resolution can prune them, so I stripped them and let `install.mjs` re-derive the rest. The fork edges (`moatless-api`, `mermaid`) are back, and `verify --only lockfile` passes. - 14 other files that both sides touched merged without conflict. `duplicate-adds` and `resolution-check` are both clean. `FilePreviewPanel.tsx` (`decide`) took upstream's `threadRef` prop and kept both fork deltas. The two unlisted files now have `converged` entries: `terminal-drawer-open-in-editor` and `thread-shell-subtasks`. In `threadShell.ts`, upstream's `isChildRunLive` and the fork's listing filter merged together correctly. - File counts: 136 files landed, against 136 in the upstream range. The only differences are `package.json` (missing, because its one upstream change was the dropped bump) and `docs/fork/inventory.json` (extra, fork-only). The fork delta is 809 files. - **Script fix:** Moatless replaced its dispatch match arms with a `MethodTable` (moatless#1138). Because of that, `unsupported-methods.mjs` found no arms and exited 2. It now reads `.detached`/`.session`/`.stream` registrations and follows handlers passed by name. Result: ADD 0, DROP 0, KEEP 2 (`vcs.switchRef`, `git.preparePullRequestThread`), which matches `gaps.md`. ## Verification `verify.mjs`: these checks pass: duplicate-adds, tripwires, resolution-check, unsupported-methods (after the fix), lockfile, fmt, lint, typecheck, build. `test` fails. Each of the failing files also failed when run alone, and they are the same five files as in the 2026-10-13 merge, all caused by the sandbox: shared `AgentScope`, server `ServerBrowserPage` (no Playwright browser), `AcpAdapterV2`, `OrchestratorReplayFixtures`, and `OpenCodeServerLedger`. ## Usable as-is - Full-screen visual replies with zoom (pingdotgg#17561). Links inside HTML renders open the way chat links do (pingdotgg#18897). App shortcuts keep working after you click into an HTML render (pingdotgg#18898). - Touch-scrolling in terminal output (pingdotgg#11305). Fixed: answering a question reset the editor caret (pingdotgg#11337). Links in agent questions are now clickable (pingdotgg#19197). - Fixed: "Subagent needs input" stayed after the subagent finished (pingdotgg#18996). This is client-side and uses `activityRunStatus` with a fallback to `status`. - Slash skill search now works mid-message (pingdotgg#19107). Fixed: removing a project opened a new thread for it (pingdotgg#15864). Settings now warn when an environment silently drops a setting (pingdotgg#18334). - Smaller fixes: context handoff details use the available width (pingdotgg#19098), pace icon alignment (pingdotgg#18580), tool-call collection perf (pingdotgg#18853), git file paths keep whitespace in the contract schema (pingdotgg#12465), Android beta links (pingdotgg#18955). - Pending context-handoff preview when you pick a model (pingdotgg#18369). It is computed on the client from `server.providers` (`requiresNewThreadForModelChange`, `continuation.groupKey`). If Moatless does not report those fields, the preview shows a handoff on every provider switch. ## Unsupported in Moatless / needs implementation - Delegated tasks in separate worktrees (pingdotgg#19102): `isolation: "worktree"` on the orchestrator MCP `delegate_task`, and `workspaceStrategy` on the child-launch command. Moatless does not create worktrees (`FEATURES.worktreeSelection`). - These land behind flags that are already gated: scheduled-task dialog fix (pingdotgg#18940, `scheduledTasks`), PR merge/auto-merge button sizing (pingdotgg#18478, pingdotgg#19111, `pullRequestSurface`), remembering editor selections (pingdotgg#19078, `openInEditor`), device tool startup failures (pingdotgg#18502, `deviceHub`), npm "update everything" (pingdotgg#18709, `serverUpdateBanner`), clone folder names in the welcome wizard (pingdotgg#12474), Cmd+Enter create-project in the palette (pingdotgg#18901). - No new RPC methods (ADD 0). ## Backend behavior to consider reproducing in Moatless I added these to the "Runtime fixes upstream made to its own server" entry in `docs/fork/gaps.md`: - Worktree isolation for delegated tasks (pingdotgg#19102). - Snoozed threads still take queued automatic wakes (pingdotgg#19099). - Indexed failed-thread error lookup (pingdotgg#18628). - SQLite: no fsync on every commit, and planner stats collected on open (pingdotgg#19205, pingdotgg#18471). - Distinct CI checks with overlapping names (pingdotgg#19162). - Bitbucket short-hash heads in review guides (pingdotgg#18900). - Webhook template backtracking (pingdotgg#19160). - OpenCode timeout formatting (pingdotgg#12469). - Pi tool schemas and turn-start queueing (pingdotgg#18643, pingdotgg#18639). - Usage hubs without a host, and Antigravity accounts deduplicated (pingdotgg#11368, pingdotgg#19207). - Haiku 5.5 as the default for background text generation (pingdotgg#18781). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- Moatless task: https://moatless.soaplabstest.com/tasks/db18f6dc-70c1-4d89-ada7-cd4b4f19a247
Every link inside an agent's HTML render opened a new browser tab, even a pull request link that opens in the right panel when it shows up in chat.
HTML render links now go through the same path as chat links. A pull request from the thread's project opens in the right panel. Any other link follows Settings > Open links in. Cmd/Ctrl-click goes straight to the system browser without reading settings. The page bootstrap now sends the click's Cmd/Ctrl state with its
ui/open-linkrequest, and the frame gets the thread from the timeline and from the files panel.The server injects the bootstrap when the page is published, so only renders published after this change send the modifier state. Older renders still get panel routing on a plain click.
Evidence
Dev server, web client, a Claude agent publishing a render with a link to #18887. Same thread and render in both runs.
Before (main): a plain click opens GitHub in a new tab, and no panel opens.
After: the pull request opens in the right panel.
Verification
vp test run packages/shared/src/htmlRender.test.ts apps/web/src/components/files/AttachmentFilePreview.test.tsx, plus web typecheck and lint on the changed files (all ran on Blacksmith)Written by Claude Opus 5.5 (
claude-opus-5-5) in Claude Code, running in T3 Code.🤖 Generated with Claude Code