Repository navigation
fix(chat): make links in agent questions clickable - #19197
Conversation
Question text in the pending user-input panel rendered as plain text, so URLs an agent asked the user to open could not be clicked. Render the question with the existing markdown renderers: ChatMarkdown on web and desktop, SelectableMarkdownText on mobile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a focused UI bug fix that reuses the existing web and mobile markdown/link renderers, with targeted test coverage and no changes to defaults, schemas, infrastructure, or static-analysis configuration. Its runtime impact is limited to rendering links and markdown in pending agent questions. 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. |
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
## What's Changed * fix(claude): default background text generation to haiku 5.5 by @maria-rcks in pingdotgg/t3code#18781 * chore(typecheck): bump tsc-rs to 0.6.0 by @t3dotgg in pingdotgg/t3code#19187 * fix(server): keep OpenCode timeouts from crashing the error formatter by @tachytelicdetonation in pingdotgg/t3code#12469 * feat(server): run delegated tasks in separate worktrees by @Bil0000 in pingdotgg/t3code#19102 * fix(git): preserve whitespace in file paths (#12464) by @Defmon3 in pingdotgg/t3code#12465 * fix(server): stop fsyncing SQLite on every commit so slow disks no longer drop clients by @t3dotgg in pingdotgg/t3code#19205 * fix(chat): make links in agent questions clickable by @t3dotgg in pingdotgg/t3code#19197 * fix(usage): show one Antigravity account once, not once per machine by @t3dotgg in pingdotgg/t3code#19207 * fix(web): Android beta links point to the APK release, not the banned Google group by @shivamhwp in pingdotgg/t3code#18955 * fix(client): "Subagent needs input" no longer sticks after the subagent finishes by @shivamhwp in pingdotgg/t3code#18996 * fix(web): stop question answers from resetting the editor caret by @shivamhwp in pingdotgg/t3code#11337 * fix(web): app shortcuts keep working after clicking into an HTML render by @maria-rcks in pingdotgg/t3code#18898 * fix(source-control): keep distinct CI checks with overlapping names by @Lucenx9 in pingdotgg/t3code#19162 * fix(server): avoid excessive backtracking in webhook templates by @Lucenx9 in pingdotgg/t3code#19160 * fix(web): auto-merge button fits its label and animates width changes by @flamboh in pingdotgg/t3code#19111 * fix(web): scroll terminal output with touch gestures by @shivamhwp in pingdotgg/t3code#11305 * feat(web): view visual replies full screen with zoom by @Bil0000 in pingdotgg/t3code#17561 * fix(web): removing a project no longer opens a new thread for it by @shivamhwp in pingdotgg/t3code#15864 * fix(server): usage hubs with a host-less URL no longer vanish from Limits by @shivamhwp in pingdotgg/t3code#11368 * fix(mobile): search bar animates in on iOS 26+ instead of popping by @juliusmarminge in pingdotgg/t3code#19209 ## New Contributors * @Defmon3 made their first contribution in pingdotgg/t3code#12465 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3080...v0.0.46-nightly.20261014.3093 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261014.3093
## What's Changed * fix(claude): default background text generation to haiku 5.5 by @maria-rcks in pingdotgg/t3code#18781 * chore(typecheck): bump tsc-rs to 0.6.0 by @t3dotgg in pingdotgg/t3code#19187 * fix(server): keep OpenCode timeouts from crashing the error formatter by @tachytelicdetonation in pingdotgg/t3code#12469 * feat(server): run delegated tasks in separate worktrees by @Bil0000 in pingdotgg/t3code#19102 * fix(git): preserve whitespace in file paths (#12464) by @Defmon3 in pingdotgg/t3code#12465 * fix(server): stop fsyncing SQLite on every commit so slow disks no longer drop clients by @t3dotgg in pingdotgg/t3code#19205 * fix(chat): make links in agent questions clickable by @t3dotgg in pingdotgg/t3code#19197 * fix(usage): show one Antigravity account once, not once per machine by @t3dotgg in pingdotgg/t3code#19207 * fix(web): Android beta links point to the APK release, not the banned Google group by @shivamhwp in pingdotgg/t3code#18955 * fix(client): "Subagent needs input" no longer sticks after the subagent finishes by @shivamhwp in pingdotgg/t3code#18996 * fix(web): stop question answers from resetting the editor caret by @shivamhwp in pingdotgg/t3code#11337 * fix(web): app shortcuts keep working after clicking into an HTML render by @maria-rcks in pingdotgg/t3code#18898 * fix(source-control): keep distinct CI checks with overlapping names by @Lucenx9 in pingdotgg/t3code#19162 * fix(server): avoid excessive backtracking in webhook templates by @Lucenx9 in pingdotgg/t3code#19160 * fix(web): auto-merge button fits its label and animates width changes by @flamboh in pingdotgg/t3code#19111 * fix(web): scroll terminal output with touch gestures by @shivamhwp in pingdotgg/t3code#11305 * feat(web): view visual replies full screen with zoom by @Bil0000 in pingdotgg/t3code#17561 * fix(web): removing a project no longer opens a new thread for it by @shivamhwp in pingdotgg/t3code#15864 * fix(server): usage hubs with a host-less URL no longer vanish from Limits by @shivamhwp in pingdotgg/t3code#11368 * fix(mobile): search bar animates in on iOS 26+ instead of popping by @juliusmarminge in pingdotgg/t3code#19209 ## New Contributors * @Defmon3 made their first contribution in pingdotgg/t3code#12465 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261013.3080...v0.0.46-nightly.20261014.3093 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261014.3093
When an agent asks a question with a link in it (for example, "Authorize this device at https://..."), the link showed as plain text. You had to copy it by hand. Now the link is clickable.
The question text now uses the markdown renderers that chat already uses. On web and desktop that is
ChatMarkdown. On mobile it isSelectableMarkdownText. So links open the same way they do in chat: on web and desktop, the preview panel or a new tab; on mobile, the PR screen or the browser. Inline code such as`RTJS-TQGS`also renders correctly now. The collapsed one-line header stays plain text, because it is the toggle button.Verification:
Related: #11132. This overlaps #18460, which also renders the options and the collapsed preview as markdown. This PR covers only the question text, but it includes mobile.
Reviewed with sol-loop: 1 round with GPT-6.1-Sol on high.
Created with Claude Opus 5.5 in Claude Code.
🤖 Generated with Claude Code